Multiplex assessment of protein variant abundance by massively parallel sequencing VAMP-seq - multiplex assay that uses fluorescent reporters to measure the steady-state abundance of protein variants in cultured human cells (each cell expresses a single variant directly fused to EGFP…the stability of the variant dictates the abundance of the EGFP fusion and, accordingly, the green fluorescence signal of the cell) - used to assess PTEN and TPMT variants

# Scatter plot of VAMP-seq scores relative to variant position in protein, colored by secondary struct
#essentially getting rid of the last row (wt)
pten1_proc_wt <- pten1_proc[!is.na(pten1_proc$position),]
#creating new column that specifices secondary structure (uses info from helix and sheet columns)
pten1_proc_wt$secondary_struct <- ifelse(is.na(pten1_proc_wt$helix), "unknown",
                        ifelse(pten1_proc_wt$helix==1, "helix",
                        ifelse(pten1_proc_wt$sheet==1, "sheet",
                        ifelse(pten1_proc_wt$helix==0, "neither",
                        "unknown"))))
pten_pos <- ggplot(pten1_proc_wt, aes(x=position, y=score, colour=secondary_struct))+ geom_point(size=.3) + scale_x_continuous(minor_breaks = seq(0, 420, 5)) + scale_color_manual(values=c("#FF4848", "#00C853", "#5757FF", "#A9A9A9")) +ylab("VAMP-seq score")+xlab("Position in PTEN")+labs(colour="Secondary Structure")+ggtitle("PTEN scores in relation to protein structure") + geom_vline(xintercept=27, color="black", size=.1) + geom_vline(xintercept=55, color="black", size=.1) + geom_vline(xintercept=70, color="black", size=.1) + geom_vline(xintercept=85, color="black", size=.1) + geom_vline(xintercept=164.5, color="black", size=.1) + geom_vline(xintercept=212, color="black", size=.1) + geom_vline(xintercept=267.5, color="black", size=.1) + geom_vline(xintercept=343.5, color="black", size=.1)+theme_bw()
#colored by change in hydrophobicity instead of secondary struct
pten_hydro <- ggplot(pten1_proc_wt, aes(x=position, y=score, colour=(hydro2-hydro1)))+ geom_point(size=.3, alpha = 0.3) + scale_x_continuous(minor_breaks = seq(0, 420, 5)) + ylab("VAMP-seq score")+xlab("Position in PTEN")+labs(colour="Hydrophobicity")+ggtitle("PTEN scores in relation to change in hydrophobicity") + geom_vline(xintercept=27, color="black", size=.1) + geom_vline(xintercept=55, color="black", size=.1) + geom_vline(xintercept=70, color="black", size=.1) + geom_vline(xintercept=85, color="black", size=.1) + geom_vline(xintercept=164.5, color="black", size=.1) + geom_vline(xintercept=212, color="black", size=.1) + geom_vline(xintercept=267.5, color="black", size=.1) + geom_vline(xintercept=343.5, color="black", size=.1)
#repeat for tpmt
tpmt1_proc_wt <- tpmt1_proc[!is.na(tpmt1_proc$position),]
tpmt1_proc_wt$secondary_struct <- ifelse(is.na(tpmt1_proc_wt$helix), "unknown",
                        ifelse(tpmt1_proc_wt$helix==1, "helix",
                        ifelse(tpmt1_proc_wt$sheet==1, "sheet",
                        ifelse(tpmt1_proc_wt$helix==0, "neither",
                        "unknown"))))
tpmt_pos <- ggplot(tpmt1_proc_wt, aes(x=position, y=score, colour=secondary_struct))+ geom_point(size=.3) + scale_x_continuous(minor_breaks = seq(0, 405, 5)) + scale_color_manual(values=c("#FF4848", "#00C853", "#5757FF", "#A9A9A9")) +ylab("VAMP-seq score")+xlab("Position in TPMT")+labs(colour="Secondary Structure")+ggtitle("TPMT scores in relation to protein structure") + geom_vline(xintercept=47, color="black", size=.1) + geom_vline(xintercept=78, color="black", size=.1) + geom_vline(xintercept=122.5, color="black", size=.1) + geom_vline(xintercept=140, color="black", size=.1) + geom_vline(xintercept=165, color="black", size=.1) + geom_vline(xintercept=194, color="black", size=.1) + geom_vline(xintercept=209, color="black", size=.1)+theme_bw()
#creating a copy of tpmt1_proc_wt, addition of column that notes change from one secondary struct to another (for violin plot purposes) (plot tpmt_pos_vp to see)
tpmt_colors <- tpmt1_proc_wt
tpmt_colors$fact <- rep(10, nrow(tpmt_colors))
temp <- 1
for(i in 1:(length(tpmt_colors$fact)-1)) {
  if (tpmt_colors$secondary_struct[i] != tpmt_colors$secondary_struct[i+1]) {
    tpmt_colors$fact[i] <- temp
    temp <- temp + 1
  } else {
  tpmt_colors$fact[i] <- temp
  }
}
tpmt_colors$fact[length(tpmt_colors$fact)] <- temp
tpmt_pos_vp <- ggplot(tpmt_colors, aes(x=position, y=score))+ geom_violin(data=tpmt_colors[c(1:2783, 2798:4000),], aes(fill=as.character(fact), colour = factor(TRUE)), draw_quantiles = c(0.5), scale = "width") + 
scale_fill_manual(values=c("1" = "#A9A9A9", "2" = "#00C853", "3" = "#FF4848", "4" = "#00C853","5" = "#FF4848", "6" = "#00C853","7" = "#5757FF", "8" = "#00C853","9" = "#FF4848","10" = "#00C853","11" = "#5757FF", "12" = "#00C853","13" = "#FF4848", "14" = "#00C853", "15" = "#5757FF", "16" = "#00C853", "17" = "#5757FF", "18" = "#00C853", "19" = "#5757FF", "20" = "#00C853", "21" = "#5757FF", "22" = "#00C853", "23" = "#FF4848", "24" = "#5757FF", "25" = "#00C853", "26" = "#FF4848", "27" = "#00C853", "28" = "#5757FF", "29" = "#00C853", "30" = "#5757FF", "31" = "#00C853")) + scale_colour_manual(values = c("black")) + scale_x_continuous(minor_breaks = seq(0, 405, 5)) + ylab("VAMP-seq score")+xlab("Position in TPMT")+labs(colour="Secondary Structure")+ggtitle("TPMT scores in relation to protein structure") + geom_vline(xintercept=47, color="black", size=.1) + geom_vline(xintercept=78, color="black", size=.1) + geom_vline(xintercept=122.5, color="black", size=.1) + geom_vline(xintercept=140, color="black", size=.1) + geom_vline(xintercept=165, color="black", size=.1) + geom_vline(xintercept=194, color="black", size=.1) + geom_vline(xintercept=209, color="black", size=.1)
# Scatter plot with change of hydrophobicity along x-axis, abundance score along y
pten_hydro1 <- ggplot(pten1_proc_wt, aes(y=score, x=(hydro2-hydro1)))+ geom_point(size=0.5, alpha = 0.3) + ylab("Hydrophobicity")+xlab("VAMP-seq score")+ggtitle("PTEN scores in relation to change in hydrophobicity")
# Violin and scatter plots of 
pten_aa_spread <- ggplot(pten1_proc_wt, aes(y=score, x=end)) + geom_violin(draw_quantiles=c(0.5))
pten_aa_spread1 <- ggplot(pten1_proc_wt, aes(y=score, x=end)) + geom_point(size = 0.5, alpha = 0.3, position = position_jitter(width = 0.1, height = NULL))
plot(pten_pos)

plot(tpmt_pos)

#plot(tpmt_pos_vp)
#plot(pten_hydro)
#plot(pten_hydro1)
plot(pten_aa_spread)

plot(pten_aa_spread1)

# Looking for possible correlation between abundance and hydrogen bonding
# preprocessing data (probably unecessary, removes rows with NA in hbond_sum, adds column that once again denotes secondary structure)
pten1_hbond <- pten1_proc[!is.na(pten1_proc$hbond_sum),]
pten1_hbond$secondary_struct <- ifelse(is.na(pten1_hbond$helix), "unknown",
                        ifelse(pten1_hbond$helix==1, "helix",
                        ifelse(pten1_hbond$sheet==1, "sheet",
                        ifelse(pten1_hbond$helix==0, "neither",
                        "unknown"))))
# Scatter of abundance score vs hbond_sum (colored by secondary struct)
pten_plot_hbond <- ggplot(pten1_hbond, aes(x=hbond_sum, y=score, colour=secondary_struct))+ geom_point(alpha=0.4) + ylab("VAMP-seq score")+xlab("DSSP Sum of hydrogen bonds")+ggtitle("PTEN scores in relation to hydrogen bonding") + scale_color_manual(values=c("#FF4848", "#696969", "#5757FF")) + labs(colour="Secondary Structure") + theme_bw()
plot(pten_plot_hbond)

# (uncolored)
pten_plot_hbond1 <- ggplot(pten1_hbond, aes(x=hbond_sum, y=score))+ geom_point(alpha = 0.2) + ylab("VAMP-seq score")+xlab("DSSP Sum of hydrogen bonds")+ggtitle("PTEN scores in relation to hydrogen bonding") + theme_bw()
plot(pten_plot_hbond1)

#repeat for tpmt
tpmt1_hbond <- tpmt1_proc[!is.na(tpmt1_proc$hbond_sum),]
tpmt1_hbond$secondary_struct <- ifelse(is.na(tpmt1_hbond$helix), "unknown",
                        ifelse(tpmt1_hbond$helix==1, "helix",
                        ifelse(tpmt1_hbond$sheet==1, "sheet",
                        ifelse(tpmt1_hbond$helix==0, "neither",
                        "unknown"))))
tpmt_plot_hbond <- ggplot(tpmt1_hbond, aes(x=hbond_sum, y=score, colour=secondary_struct))+ geom_point(alpha=0.4) + ylab("VAMP-seq score")+xlab("DSSP Sum of hydrogen bonds")+ggtitle("PTEN scores in relation to hydrogen bonding") + scale_color_manual(values=c("#FF4848", "#696969", "#5757FF")) + labs(colour="Secondary Structure") + theme_bw()
plot(tpmt_plot_hbond)

tpmt_plot_hbond1 <- ggplot(tpmt1_hbond, aes(x=hbond_sum, y=score))+ geom_point(alpha = 0.2) + ylab("VAMP-seq score")+xlab("DSSP Sum of hydrogen bonds")+ggtitle("TPMT scores in relation to hydrogen bonding") + theme_bw()
plot(tpmt_plot_hbond1)

#less hydrogen bonds ~ higher abundance
#method1 for visualizing tracks (basic, for visualizing in rstudio)
grid.newpage()
grid.draw(rbind(ggplotGrob(tpmt_dssp_schematic), ggplotGrob(tpmt_pos_mean), ggplotGrob(tpmt_heat), size = "last"))

grid.newpage()
grid.draw(rbind(ggplotGrob(pten_dssp_schematic), ggplotGrob(pten_pos_mean), ggplotGrob(pten_heat), size = "last"))
#plotting mean score vs variant changed to 
tpmt_end_sum <- summarySE(tpmt1_proc_wt, measurevar="score", groupvars="end")
tpmt_end_mean <- ggplot(tpmt_end_sum, aes(x=end, y=score)) +
  geom_bar(position=position_dodge(), stat="identity", colour="#999999") +
  geom_errorbar(aes(ymin=score-sd, ymax=score+sd), width=0.001, position=position_dodge()) +
  ylab("mean abundance") + xlab("variant amino acid") + theme_bw()
plot(tpmt_end_mean)

#plotting scores vs 'end' colored by location/secondary structure
tpmt_end_scores_b <- ggplot(data=subset(tpmt1_proc_wt, sheet==1), aes(x=end, y=score, colour=position)) +
  geom_violin(data=subset(tpmt1_proc_wt, sheet==1), draw_quantiles=0.5, scale = "width") +
  geom_point(data=subset(tpmt1_proc_wt, sheet==1), size=.3, alpha = 0.6, position=jitter2) + ylab("abundance") + xlab("variant aa") +
  scale_y_continuous(limits = c(-0.8, 2.2))
tpmt_end_scores_a <- ggplot(data=subset(tpmt1_proc_wt, helix==1), aes(x=end, y=score, colour=position)) +
  geom_violin(data=subset(tpmt1_proc_wt, helix==1), draw_quantiles=0.5, scale = "width") +
  geom_point(data=subset(tpmt1_proc_wt, helix==1), size=.3, alpha = 0.6, position=jitter2) + ylab("abundance") + xlab("variant aa") +
  scale_y_continuous(limits = c(-0.8, 2.2))
tpmt_end_scores_n <- ggplot(data=subset(tpmt1_proc_wt, secondary_struct=="neither"), aes(x=end, y=score, colour=position)) +
  geom_violin(data=subset(tpmt1_proc_wt, secondary_struct=="neither"), draw_quantiles=0.5, scale = "width") +
  geom_point(data=subset(tpmt1_proc_wt, secondary_struct=="neither"), size=.3, alpha = 0.6, position=jitter2) + ylab("abundance") + xlab("variant aa") +
  scale_y_continuous(limits = c(-0.8, 2.2))
plot(tpmt_end_scores_b)

plot(tpmt_end_scores_a)

plot(tpmt_end_scores_n)

#tpmt_end_scores_60 <- ggplot(data=subset(tpmt1_proc_wt, position<=60), aes(x=end, y=score, colour=position)) +
#  geom_violin(data=subset(tpmt1_proc_wt, position<=60), draw_quantiles=0.5, scale = "width") +
#  geom_point(data=subset(tpmt1_proc_wt, position<=60), size=.3, alpha = 0.6, position=jitter2) + ylab("abundance") + xlab("variant aa") +
#  scale_y_continuous(limits = c(-0.8, 2.2))
#tpmt_end_scores_120 <- ggplot(data=subset(tpmt1_proc_wt, position>60 & position<=120), aes(x=end, y=score, colour=position)) +
#  geom_violin(data=subset(tpmt1_proc_wt, position>60 & position<=120), draw_quantiles=0.5, scale = "width") +
#  geom_point(data=subset(tpmt1_proc_wt, position>60 & position<=120), size=.3, alpha = 0.6, position=jitter2) + ylab("abundance") + xlab("variant aa") +
#  scale_y_continuous(limits = c(-0.8, 2.2))
#tpmt_end_scores_180 <- ggplot(data=subset(tpmt1_proc_wt, position>120 & position<=180), aes(x=end, y=score, colour=position)) +
#  geom_violin(data=subset(tpmt1_proc_wt, position>120 & position<=180), draw_quantiles=0.5, scale = "width") +
#  geom_point(data=subset(tpmt1_proc_wt, position>120 & position<=180), size=.3, alpha = 0.6, position=jitter2) + ylab("abundance") + xlab("variant aa") +
#  scale_y_continuous(limits = c(-0.8, 2.2))
#tpmt_end_scores_245 <- ggplot(data=subset(tpmt1_proc_wt, position>180 & position<=245), aes(x=end, y=score, colour=position)) +
#  geom_violin(data=subset(tpmt1_proc_wt, position>180 & position<=245), draw_quantiles=0.5, scale = "width") +
#  geom_point(data=subset(tpmt1_proc_wt, position>180 & position<=245), size=.3, alpha = 0.6, position=jitter2) + ylab("abundance") + xlab("variant aa") +
#  scale_y_continuous(limits = c(-0.8, 2.2))
#plot(tpmt_end_scores_60)
#plot(tpmt_end_scores_120)
#plot(tpmt_end_scores_180)
#plot(tpmt_end_scores_245)

# More of above
pten_a_spread1 <- ggplot(pten1_proc_wt, aes(y=score, x=factor(position), colour = end)) + geom_violin(draw_quantiles=c(0.5), data=subset(pten1_proc_wt, start== "A"), aes(group=factor(position)), scale = "width") + xlab("Position in PTEN") + ggtitle("Alanine variant abundance scores")+ geom_point(data=subset(pten1_proc_wt, start== "A"), aes(x=factor(position), y=score), alpha = 0.85, position=jitter2) + scale_color_manual(values=twenty_color) + theme_bw()

pten_a_aa <- ggplot(pten1_proc_wt, aes(y=score, x=end, colour = end)) + geom_violin(draw_quantiles=c(0.5), data=subset(pten1_proc_wt, start== "A"), aes(group=end), scale = "width") + xlab("Amino acid") + ggtitle("Alanine variant abundance scores")+ geom_point(data=subset(pten1_proc_wt, start== "A"), aes(x=end, y=score), alpha = 0.75, position=jitter1) + scale_color_manual(values=twenty_color) + theme_bw()

pten_r_spread1 <- ggplot(pten1_proc_wt, aes(y=score, x=factor(position), colour = end)) + geom_violin(draw_quantiles=c(0.5), data=subset(pten1_proc_wt, start== "R"), aes(group=factor(position)), scale = "width") + xlab("Position in PTEN") + ggtitle("Arganine variant abundance scores")+ geom_point(data=subset(pten1_proc_wt, start== "R"), aes(x=factor(position), y=score), alpha = 0.85, position=jitter2) + scale_color_manual(values=twenty_color) + theme_bw()

pten_r_aa <- ggplot(pten1_proc_wt, aes(y=score, x=end, colour = end)) + geom_violin(draw_quantiles=c(0.5), data=subset(pten1_proc_wt, start== "R"), aes(group=end), scale = "width") + xlab("Amino acid") + ggtitle("Arganine variant abundance scores")+ geom_point(data=subset(pten1_proc_wt, start== "R"), aes(x=end, y=score), alpha = 0.75, position=jitter1) + scale_color_manual(values=twenty_color) + theme_bw()

pten_n_spread1 <- ggplot(pten1_proc_wt, aes(y=score, x=factor(position), colour = end)) + geom_violin(draw_quantiles=c(0.5), data=subset(pten1_proc_wt, start== "N"), aes(group=factor(position)), scale = "width") + xlab("Position in PTEN") + ggtitle("Asparagine variant abundance scores")+ geom_point(data=subset(pten1_proc_wt, start== "N"), aes(x=factor(position), y=score), alpha = 0.85, position=jitter2) + scale_color_manual(values=twenty_color) + theme_bw()

pten_n_aa <- ggplot(pten1_proc_wt, aes(y=score, x=end, colour = end)) + geom_violin(draw_quantiles=c(0.5), data=subset(pten1_proc_wt, start== "N"), aes(group=end), scale = "width") + xlab("Amino acid") + ggtitle("Asparagine variant abundance scores")+ geom_point(data=subset(pten1_proc_wt, start== "N"), aes(x=end, y=score), alpha = 0.75, position=jitter1) + scale_color_manual(values=twenty_color) + theme_bw()

pten_d_spread1 <- ggplot(pten1_proc_wt, aes(y=score, x=factor(position), colour = end)) + geom_violin(draw_quantiles=c(0.5), data=subset(pten1_proc_wt, start== "D"), aes(group=factor(position)), scale = "width") + xlab("Position in PTEN") + ggtitle("Aspartic Acid variant abundance scores")+ geom_point(data=subset(pten1_proc_wt, start== "D"), aes(x=factor(position), y=score), alpha = 0.85, position=jitter2) + scale_color_manual(values=twenty_color) + theme_bw()

pten_d_aa <- ggplot(pten1_proc_wt, aes(y=score, x=end, colour = end)) + geom_violin(draw_quantiles=c(0.5), data=subset(pten1_proc_wt, start== "D"), aes(group=end), scale = "width") + xlab("Amino acid") + ggtitle("Aspartic Acid variant abundance scores")+ geom_point(data=subset(pten1_proc_wt, start== "D"), aes(x=end, y=score), alpha = 0.75, position=jitter1) + scale_color_manual(values=twenty_color) + theme_bw()

pten_n_hydrodiff <- ggplot(pten1_proc_wt, aes(y=score, x=factor(position), colour = (hydro2-hydro1))) + geom_violin(draw_quantiles=c(0.5), data=subset(pten1_proc_wt, start== "N"), aes(group=factor(position)), scale = "width") + xlab("Position in PTEN") + ggtitle("Asparagine variant abundance scores w/ hydrophobicity change")+ geom_point(data=subset(pten1_proc_wt, start== "N"), aes(x=factor(position), y=score), alpha = 0.85, position=jitter2) + scale_color_distiller(palette = "Spectral") + theme_bw()

pten_d_hydrodiff <- ggplot(pten1_proc_wt, aes(y=score, x=factor(position), colour = (hydro2-hydro1))) + geom_violin(draw_quantiles=c(0.5), data=subset(pten1_proc_wt, start== "D"), aes(group=factor(position)), scale = "width") + xlab("Position in PTEN") + ggtitle("Aspartic Acid variant abundance scores w/ hydrophobicity change")+ geom_point(data=subset(pten1_proc_wt, start== "D"), aes(x=factor(position), y=score), alpha = 0.85, position=jitter2) + scale_color_distiller(palette = "Spectral") + theme_bw()

plot(pten_a_spread1)
plot(pten_a_aa)
plot(pten_r_spread1)
plot(pten_r_aa)
plot(pten_n_spread1)
plot(pten_n_hydrodiff)
plot(pten_n_aa)
plot(pten_d_spread1)
plot(pten_d_hydrodiff)
plot(pten_d_aa)
ggplot(pten1_proc_wt, aes(y=score, x=factor(position), colour = end)) + geom_violin(draw_quantiles=c(0.5), data=subset(pten1_proc_wt, start== "P"), aes(group=factor(position)), scale = "width") + xlab("Position in PTEN") + ggtitle("Proline variant abundance scores")+ geom_point(data=subset(pten1_proc_wt, start== "P"), aes(x=factor(position), y=score), alpha = 0.85, position=jitter2) + scale_color_manual(values=twenty_color) + theme_bw()

ggplot(pten1_proc_wt, aes(y=score, x=end, colour = end)) + geom_violin(draw_quantiles=c(0.5), data=subset(pten1_proc_wt, start== "P"), aes(group=end), scale = "width") + xlab("Amino acid") + ggtitle("Proline variant abundance scores")+ geom_point(data=subset(pten1_proc_wt, start== "P"), aes(x=end, y=score), alpha = 0.75, position=jitter1) + scale_color_manual(values=twenty_color) + theme_bw()

ggplot(pten1_proc_wt, aes(y=score, x=factor(position), colour = (hydro2-hydro1))) + geom_violin(draw_quantiles=c(0.5), data=subset(pten1_proc_wt, start== "P"), aes(group=factor(position)), scale = "width") + xlab("Position in PTEN") + ggtitle("Proline variant abundance scores w/ hydrophobicity change")+ geom_point(data=subset(pten1_proc_wt, start== "P"), aes(x=factor(position), y=score), alpha = 0.85, position=jitter2) + scale_color_distiller(palette = "Spectral") + theme_bw()

#graphs for Threonine
ggplot(pten1_proc_wt, aes(y=score, x=factor(position), colour = end)) + geom_violin(draw_quantiles=c(0.5), data=subset(pten1_proc_wt, start== "T"), aes(group=factor(position)), scale = "width") + xlab("Position in PTEN") + ggtitle("T variant abundance scores")+ geom_point(data=subset(pten1_proc_wt, start== "T"), aes(x=factor(position), y=score), alpha = 0.85, position=jitter2) + scale_color_manual(values=twenty_color) + theme_bw()

ggplot(pten1_proc_wt, aes(y=score, x=end, colour = end)) + geom_violin(draw_quantiles=c(0.5), data=subset(pten1_proc_wt, start== "T"), aes(group=end), scale = "width") + xlab("Amino acid") + ggtitle("T variant abundance scores")+ geom_point(data=subset(pten1_proc_wt, start== "T"), aes(x=end, y=score), alpha = 0.75, position=jitter1) + scale_color_manual(values=twenty_color) + theme_bw()

ggplot(pten1_proc_wt, aes(y=score, x=factor(position), colour = (hydro2-hydro1))) + geom_violin(draw_quantiles=c(0.5), data=subset(pten1_proc_wt, start== "T"), aes(group=factor(position)), scale = "width") + xlab("Position in PTEN") + ggtitle("T variant abundance scores w/ hydrophobicity change")+ geom_point(data=subset(pten1_proc_wt, start== "T"), aes(x=factor(position), y=score), alpha = 0.85, position=jitter2) + scale_color_distiller(palette = "Spectral") + theme_bw()

# To plot positions with low stddev (excluding nonsense)

#creating new dataframe which includes mean abundance and variance, and discludes nonsense mutations (nonsense mutations cut proteins short and usually result in very low abundance scores, so I've decided to treat them separately from missense/synonymous mutations)
pten_variance <- summarySE((subset(pten1_data, end != "X")), measurevar="score", groupvars="position", na.rm=TRUE)

# Filtering for positions with enough variants and low variance in variant abundance scores
#adjust N (minimum # variants at a position) and stddev to liking
#5, 0.11
#10, 0.15
pten_variance_filtered <- subset(subset(pten_variance, N > 8 ), sd < 0.11)

#nonsense variant scores are graphed as dots, but are not included in the overlaying violin plots
ggplot(no_nonsense, aes(y=score, x=factor(position), colour = end)) + 
  geom_violin(draw_quantiles=c(0.5), data=subset(no_nonsense, no_nonsense$position %in% pten_variance_filtered$position), aes(group=factor(position)), scale = "width") + 
  xlab("Position in PTEN") + ggtitle("Intolerant and tolerant amino acid positions") +
  geom_point(data=subset(pten1_proc_wt, pten1_proc_wt$position %in% pten_variance_filtered$position), aes(x=factor(position), y=score), alpha = 0.85, position=jitter1) + scale_color_manual(values=twenty_color) + theme_bw()

ggplot(no_nonsense, aes(y=score, x=position, colour = end)) + 
  geom_violin(draw_quantiles=c(0.5), data=subset(no_nonsense, no_nonsense$position %in% pten_variance_filtered$position), aes(group=position%%450), scale = "width") + 
  xlab("Position in PTEN") + ggtitle("Intolerant and tolerant amino acid positions") +
  geom_point(data=subset(pten1_proc_wt, pten1_proc_wt$position %in% pten_variance_filtered$position), aes(x=position, y=score), alpha = 0.85, position=jitter1) + scale_color_manual(values=twenty_color) + theme_bw()
# Repeat of above ,just testing different N and stddev parameter 
pten_variance_filtered1 <- subset(subset(pten_variance, N > 10), sd > 0.25)
ggplot(no_nonsense, aes(y=score, x=factor(position), colour = end)) + 
  geom_violin(draw_quantiles=c(0.5), data=subset(no_nonsense, no_nonsense$position %in% pten_variance_filtered1$position), aes(group=factor(position)), scale = "width") + 
  xlab("Position in PTEN") + ggtitle("Intolerant and tolerant amino acid positions") +
  geom_point(data=subset(pten1_proc_wt, pten1_proc_wt$position %in% pten_variance_filtered1$position), aes(x=factor(position), y=score), alpha = 0.85, position=jitter1) + scale_color_manual(values=twenty_color) + theme_bw()

ggplot(no_nonsense, aes(y=score, x=position, colour = end)) + 
  geom_violin(draw_quantiles=c(0.5), data=subset(no_nonsense, no_nonsense$position %in% pten_variance_filtered1$position), aes(group=position%%450), scale = "width") + 
  xlab("Position in PTEN") + ggtitle("Intolerant and tolerant amino acid positions") +
  geom_point(data=subset(pten1_proc_wt, pten1_proc_wt$position %in% pten_variance_filtered1$position), aes(x=position, y=score), alpha = 0.85, position=jitter1) + scale_color_manual(values=twenty_color) + theme_bw()

chosen <- c(61, 68, 105, 108, 123, 127, 130, 132, 135, 155, 165, 173, 174, 246, 323, 335)
ggplot(pten1_proc_wt, aes(y=score, x=factor(position), colour = end)) + 
  geom_violin(draw_quantiles=c(0.5), data=subset(pten1_proc_wt, pten1_proc_wt$position %in% chosen), aes(group=factor(position)), scale = "width") + 
  xlab("Position in PTEN") + ggtitle("Clinvar path/likely path variant positions") +
  geom_point(data=subset(pten1_proc_wt, pten1_proc_wt$position %in% chosen), aes(x=factor(position), y=score), alpha = 0.85, position=jitter1) + scale_color_manual(values=twenty_color) + theme_bw()

# New track for heat-mean-variance-secondary-struct plot

#this is how pten_variance was defined: pten_variance <- summarySE((subset(pten1_data, end != "X")), measurevar="score", groupvars="position", na.rm=TRUE)
pten_variance_filtered4 <-subset(pten_variance, N>5)
variance_bar <- ggplot(pten_variance_filtered4, aes(y=sd, x=position)) +
  geom_segment(aes(x=position, xend=position, y=0, yend=sd), color="grey68") +
  geom_point(size=0.5) +
  scale_x_continuous(breaks = seq(0, 403, 20), expand = c(0,0)) + scale_y_continuous(expand = c(0,0))+theme(axis.title.x = element_blank(), axis.text.x = element_blank(), legend.position="none")
plot(variance_bar)

gd=ggplot_gtable(ggplot_build(variance_bar))
maxWidth = grid::unit.pmax(ga$widths, gb$widths, gc$widths, gd$widths)
ga$widths <- as.list(maxWidth)
gb$widths <- as.list(maxWidth)
gc$widths <- as.list(maxWidth)
gd$widths <- as.list(maxWidth)
grid.newpage()

##storing, with specified widths!!
#pdf('pten_tpmt_mean_heat_variance.pdf', width=8, height=6)
#grid.arrange(arrangeGrob(gc,gd,ga,gb,nrow=4,heights=c(.1,.15,.15,.6)))
#dev.off()
# Multiplex paper's Fig2b (PTEN) shows trailing tails for the nonsense and synonymous variant scores
# this is to identify and investigate why variants in this tail are so far from their means
pten1_nonsense <- subset(pten1_proc, class == "nonsense")
tpmt1_nonsense <- subset(tpmt1_proc, class == "nonsense")
pten1_synon <- subset(pten1_proc, class == "synonymous")
tpmt1_synon <- subset(tpmt1_proc, class == "synonymous")
pten1_no_missense <- subset(pten1_proc, class == "synonymous" | class == "nonsense")
ggplot(pten1_nonsense, aes(x=score)) + geom_histogram(binwidth=.01, colour="blue", fill="white") + theme_bw()

#+ geom_density()
ggplot(pten1_synon, aes(x=score)) + geom_histogram(binwidth=.01, colour="red", fill="white") + theme_bw()

ggplot(pten1_proc_wt, aes(x=score)) + geom_histogram(data=subset(pten1_proc_wt,class == "nonsense"), fill = "red", alpha = 0.5, binwidth=.01) + geom_histogram(data=subset(pten1_proc_wt,class == "synonymous"), fill = "blue", alpha = 0.5, binwidth=.01) + geom_histogram(data=subset(pten1_proc_wt,class == "missense"), fill = "green", alpha = 0.2, binwidth=.01) + theme_bw()

ggplot(pten1_no_missense, aes(x=score)) + geom_histogram(data=subset(pten1_no_missense,class == "nonsense"), fill = "red", alpha = 0.5, binwidth=.01) + geom_histogram(data=subset(pten1_no_missense,class == "synonymous"), fill = "blue", alpha = 0.5, binwidth=.01) + theme_bw()

# TPMT
#ggplot(tpmt1_nonsense, aes(x=score)) + geom_histogram(binwidth=.01, colour="blue", fill="white") + theme_bw()
#ggplot(tpmt1_synon, aes(x=score)) + geom_histogram(binwidth=.01, colour="red", fill="white") + theme_bw()
# we can see the paper used a different scale, which was ... deceiving
# not many variants are nonsense or synonymous, so the tail is not actually that large for both of them
# Taking a subset of the data, all variants above a certain score (for nonsense), and below a certain score (for synonymous)
#0.55
nonsense_tail <- subset(pten1_nonsense, score > 0.6)
synon_tail <- subset(pten1_synon, score < 0.6)
nonsense_tail$secondary_struct <- ifelse(is.na(nonsense_tail$helix), "unknown",
                        ifelse(nonsense_tail$helix==1, "helix",
                        ifelse(nonsense_tail$sheet==1, "sheet",
                        ifelse(nonsense_tail$helix==0, "neither",
                        "unknown"))))
synon_tail$secondary_struct <- ifelse(is.na(synon_tail$helix), "unknown",
                        ifelse(synon_tail$helix==1, "helix",
                        ifelse(synon_tail$sheet==1, "sheet",
                        ifelse(synon_tail$helix==0, "neither",
                        "unknown"))))
n_tail <- nonsense_tail[,c(1,2,7,30,127)]
s_tail <- synon_tail[,c(1,2,7,30,127)]
n_tail$bp_pos <- (n_tail$position-1)*3
s_tail$bp_pos <- (s_tail$position-1)*3
n_tail
s_tail
# Graphing the positions of these variants in the protein
#just in case there is a discernible pattern
s_tail_pos <- ggplot(s_tail, aes(x=position, y=score, colour=secondary_struct))+ geom_point(size=.3) + scale_x_continuous(minor_breaks = seq(0, 405, 5)) + scale_color_manual(values=c("#FF4848", "#00C853", "#5757FF", "#A9A9A9")) +ylab("VAMP-seq score")+xlab("Position in PTEN")+labs(colour="Secondary Structure")+ggtitle("PTEN synonymous variant tail scores in relation to protein structure") + theme_bw()
plot(s_tail_pos)

n_tail_pos <- ggplot(n_tail, aes(x=position, y=score, colour=secondary_struct))+ geom_point(size=.3) + scale_x_continuous(minor_breaks = seq(0, 405, 5)) + scale_color_manual(values=c("#FF4848", "#00C853", "#5757FF", "#A9A9A9")) +ylab("VAMP-seq score")+xlab("Position in PTEN")+labs(colour="Secondary Structure")+ggtitle("PTEN nonsense variant tail scores in relation to protein structure") + theme_bw()
plot(n_tail_pos)

TPMT_abun_CADD <- ggplot(tpmt_merge, aes(x=abundance_class, y=CADD_raw_rankscore)) + geom_violin(draw_quantiles = c( 0.5))+ylab("CADD raw rankscore")+xlab("Abundance Class") + theme_bw()
plot(TPMT_abun_CADD)

TPMT_abun_SIFT_conv <- ggplot(tpmt_merge, aes(x=abundance_class, y=as.numeric(SIFT_converted_rankscore))) + geom_violin(draw_quantiles = c(0.5))+ylab("SIFT conv rankscore")+xlab("Abundance Class") + theme_bw()
plot(TPMT_abun_SIFT_conv)

TPMT_abun_POLY <- ggplot(tpmt_merge, aes(x=abundance_class, y=as.numeric(Polyphen2_HDIV_rankscore))) + geom_violin(draw_quantiles = c( 0.5))+ylab("Polyphen2 HDIV rankscore")+xlab("Abundance Class") + theme_bw()
plot(TPMT_abun_POLY)

TPMT_abun_POLY1 <- ggplot(tpmt_merge, aes(x=abundance_class, y=as.numeric(Polyphen2_HVAR_rankscore))) + geom_violin(draw_quantiles = c( 0.5))+ylab("Polyphen2 HVAR rankscore")+xlab("Abundance Class") + theme_bw()
plot(TPMT_abun_POLY1)

# Bar plots of what Polyphen and SIFT scores make up each abundance class!
Pred_abun_SIFT <- ggplot(tpmt_merge, aes(abundance_class)) + geom_bar(aes(fill = SIFT_pred)) + ggtitle("Abundance class vs SIFT prediction of Damaging or Tolerated") + theme_bw()
plot(Pred_abun_SIFT)

trial_sep <- tpmt_merge[c(21,23,24,26)]
tpmt_merge_expand <- separate_rows(tpmt_merge, c("Polyphen2_HDIV_score", "Polyphen2_HDIV_pred", "Polyphen2_HVAR_score", "Polyphen2_HVAR_pred"))
Pred_abun_HVAR <- ggplot(tpmt_merge_expand, aes(abundance_class)) + geom_bar(aes(fill = Polyphen2_HVAR_pred)) + ggtitle("Abundance class vs Polyphen2 HVAR predictions") + labs(subtitle = "D: Probably Damaging, P: Possibly Damaging, B: Benign") + theme_bw()
plot(Pred_abun_HVAR)

# Focusing on individual "end", or variant, amino acids! A lot more can be done... and a lot of what I have here is unfocused and too busy to be helpful
twenty_color1 = c("#D02028", "#A4C33B","#53958B", "#E6A3B4", "#C5A0CA", "#554DA0", "#99247E", "#402059", "#82421B", "#7E807E", 'black', "#EDD941", "#F2F08E", "#EEC898", "#E1A12F", "#76C158",  "#BCDDAE", "#85782E", "#315935", "#A1DAE0", "#486EB6")
pten_dssp_schematic1 <- ggplot() +
  geom_segment(aes(x = 1, y = 0, xend = max(pten_extra$position)), yend = 0, size = 1, color = "grey70") +
  geom_point(data = subset(pten_extra, !is.na(xca)), aes(x = position, y = 0), color = "black", size = 1.8) +
  geom_point(data = subset(pten_extra, sheet == 1), aes(x = position, y = 0), color = "pink", size = 1.5) +
  geom_point(data = subset(pten_extra, helix == 1), aes(x = position, y = 0), color = "cyan", size = 1.5) +
  scale_x_continuous(breaks = seq(0, 403, 20), expand = c(0,0)) +
  scale_y_continuous(breaks = NULL, expand = c(0,0)) +xlab("Position in PTEN") + ylab("\n \n \n") +
  theme(panel.border = element_blank(), axis.text.y = element_blank())
aas <- c("A", "C", "P", "X")
aas1 <- c("S", "C", "P", "X")
aas2 <- c("A", "C", "D", "E", "F", "G", "H", "I", "K", "L", "M", "N", "P", "Q", "R", "S", "T", "V", "W", "Y")
pten_a_pos <- ggplot(data=subset(pten1_proc_wt, end=="A"), aes(x=position, y=score, colour=start))+ geom_point(data=subset(pten1_proc_wt, end=="A" & start %in% aas2), size=.6) + scale_x_continuous(breaks=seq(0, 403, 20), minor_breaks = seq(0, 403, 5), limits = c(0, 403), expand = c(0,0)) + scale_y_continuous(expand = c(0,0), limits = c(-0.25, 1.5)) + scale_color_manual(values=twenty_color1) +ylab("Abundance score")+labs(colour="Reference amino acid")+xlab(NULL)+ggtitle("Abundance scores of Alanine variants") + theme(axis.text.x = element_blank(), legend.position='top') + geom_hline(yintercept=1, color="black", size=.1)
#plot(pten_a_pos)
pten_s_pos <- ggplot(data=subset(pten1_proc_wt, end=="S"), aes(x=position, y=score, colour=start))+ geom_point(data=subset(pten1_proc_wt, end=="S" & start %in% aas2), size=.6) + scale_x_continuous(breaks=seq(0, 403, 20), minor_breaks = seq(0, 403, 5), limits = c(0, 403), expand = c(0,0)) + scale_y_continuous(expand = c(0,0), limits = c(-0.25, 1.5)) + scale_color_manual(values=twenty_color1) +ylab("Abundance score")+labs(colour="Reference amino acid")+xlab(NULL)+ggtitle("Abundance scores of Serine variants") + theme(axis.text.x = element_blank(), legend.position='top') + geom_hline(yintercept=1, color="black", size=.1)
pten_c_pos <- ggplot(data=subset(pten1_proc_wt, end=="C"), aes(x=position, y=score, colour=start))+ geom_point(data=subset(pten1_proc_wt, end=="C" & start %in% aas2), size=.6) + scale_x_continuous(breaks=seq(0, 403, 20), minor_breaks = seq(0, 403, 5), limits = c(0, 403), expand = c(0,0)) + scale_y_continuous(expand = c(0,0), limits = c(-0.25, 1.5)) + scale_color_manual(values=twenty_color1) +ylab("Abundance score")+labs(colour="Reference amino acid")+xlab(NULL)+ggtitle("Abundance scores of Cysteine variants") + theme(axis.text.x = element_blank(), legend.position='top') + geom_hline(yintercept=1, color="black", size=.1)
pten_x_pos <- ggplot(data=subset(pten1_proc_wt, end=="X"), aes(x=position, y=score, colour=start))+ geom_point(data=subset(pten1_proc_wt, end=="X" & start %in% aas2), size=.6) + scale_x_continuous(breaks=seq(0, 403, 20), minor_breaks = seq(0, 403, 5), limits = c(0, 403), expand = c(0,0)) + scale_y_continuous(expand = c(0,0), limits = c(-0.25, 1.5)) + scale_color_manual(values=twenty_color1) +ylab("Abundance score")+labs(colour="Reference amino acid")+xlab(NULL)+ggtitle("Abundance scores of nonsense variants") + theme(axis.text.x = element_blank(), legend.position='top') + geom_hline(yintercept=1, color="black", size=.1)
grid.newpage()
grid.draw(rbind(ggplotGrob(pten_a_pos), ggplotGrob(pten_dssp_schematic1), size = "last"))

grid.newpage()
grid.draw(rbind(ggplotGrob(pten_s_pos), ggplotGrob(pten_dssp_schematic1), size = "last"))

grid.newpage()
grid.draw(rbind(ggplotGrob(pten_c_pos), ggplotGrob(pten_dssp_schematic1), size = "last"))

grid.newpage()
grid.draw(rbind(ggplotGrob(pten_x_pos), ggplotGrob(pten_dssp_schematic1), size = "last"))

# More of above
#snake at the end (arches over grey region)
pten_p_pos <- ggplot(data=subset(pten1_proc_wt, end=="P"), aes(x=position, y=score, colour=start))+ geom_point(data=subset(pten1_proc_wt, end=="P" & start %in% aas2), size=.6) + scale_x_continuous(breaks=seq(0, 403, 20), minor_breaks = seq(0, 403, 5), limits = c(0, 403), expand = c(0,0)) + scale_y_continuous(expand = c(0,0), limits = c(-0.25, 1.5)) + scale_color_manual(values=twenty_color1) +ylab("Abundance score")+labs(colour="Reference amino acid")+xlab(NULL)+ggtitle("Abundance scores of Proline variants") + theme(axis.text.x = element_blank(), legend.position='top') + geom_hline(yintercept=1, color="black", size=.1)
grid.newpage()
grid.draw(rbind(ggplotGrob(pten_p_pos), ggplotGrob(pten_dssp_schematic1), size = "last"))
# More of above
#matching snake at the end!
pten_g_pos <- ggplot(data=subset(pten1_proc_wt, end=="G"), aes(x=position, y=score, colour=start))+ geom_point(data=subset(pten1_proc_wt, end=="G" & start %in% aas2), size=.6) + scale_x_continuous(breaks=seq(0, 403, 20), minor_breaks = seq(0, 403, 5), limits = c(0, 403), expand = c(0,0)) + scale_y_continuous(expand = c(0,0), limits = c(-0.25, 1.5)) + scale_color_manual(values=twenty_color1) +ylab("Abundance score")+labs(colour="Reference amino acid")+xlab(NULL)+ggtitle("Abundance scores of Glycine variants") + theme(axis.text.x = element_blank(), legend.position='top') + geom_hline(yintercept=1, color="black", size=.1)
grid.newpage()
grid.draw(rbind(ggplotGrob(pten_g_pos), ggplotGrob(pten_dssp_schematic1), size = "last"))

pten_h_pos <- ggplot(data=subset(pten1_proc_wt, end=="H"), aes(x=position, y=score, colour=start))+ geom_point(data=subset(pten1_proc_wt, end=="H" & start %in% aas2), size=.6) + scale_x_continuous(breaks=seq(0, 403, 20), minor_breaks = seq(0, 403, 5), limits = c(0, 403), expand = c(0,0)) + scale_y_continuous(expand = c(0,0), limits = c(-0.25, 1.5)) + scale_color_manual(values=twenty_color1) +ylab("Abundance score")+labs(colour="Reference amino acid")+xlab(NULL)+ggtitle("Abundance scores of Histidine variants") + theme(axis.text.x = element_blank(), legend.position='top') + geom_hline(yintercept=1, color="black", size=.1)
grid.newpage()
grid.draw(rbind(ggplotGrob(pten_h_pos), ggplotGrob(pten_dssp_schematic1), size = "last"))

# notice 2nd from last grey region
pten_w_pos <- ggplot(data=subset(pten1_proc_wt, end=="W"), aes(x=position, y=score, colour=start))+ geom_point(data=subset(pten1_proc_wt, end=="W" & start %in% aas2), size=.6) + scale_x_continuous(breaks=seq(0, 403, 20), minor_breaks = seq(0, 403, 5), limits = c(0, 403), expand = c(0,0)) + scale_y_continuous(expand = c(0,0), limits = c(-0.25, 1.5)) + scale_color_manual(values=twenty_color1) +ylab("Abundance score")+labs(colour="Reference amino acid")+xlab(NULL)+ggtitle("Abundance scores of Typtophan variants") + theme(axis.text.x = element_blank(), legend.position='top') + geom_hline(yintercept=1, color="black", size=.1)
grid.newpage()
grid.draw(rbind(ggplotGrob(pten_w_pos), ggplotGrob(pten_dssp_schematic1), size = "last"))

LS0tCnRpdGxlOiAiUFRFTiBSIE5vdGVib29rIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCmBgYHtyIGdsb2JhbF9vcHRpb25zLCBpbmNsdWRlPUZBTFNFfQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGdncGxvdDIpCnJlcXVpcmUoZ3JpZEV4dHJhKQpsaWJyYXJ5KHJlc2hhcGUyKQpsaWJyYXJ5KHByYWNtYSkKbGlicmFyeShnZ2JlZXN3YXJtKQpsaWJyYXJ5KFJtaXNjKQpsaWJyYXJ5KGdyaWQpCmxpYnJhcnkoRUJJbWFnZSkKbGlicmFyeShnb29nbGVzaGVldHMpCmxpYnJhcnkodGlkeXIpCmxpYnJhcnkoZHBseXIpCmtuaXRyOjpvcHRzX2NodW5rJHNldChmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9MTIsIHdhcm5pbmc9RkFMU0UpCmBgYApNdWx0aXBsZXggYXNzZXNzbWVudCBvZiBwcm90ZWluIHZhcmlhbnQgYWJ1bmRhbmNlIGJ5IG1hc3NpdmVseSBwYXJhbGxlbCBzZXF1ZW5jaW5nClZBTVAtc2VxCi0gbXVsdGlwbGV4IGFzc2F5IHRoYXQgdXNlcyBmbHVvcmVzY2VudCByZXBvcnRlcnMgdG8gbWVhc3VyZSB0aGUgc3RlYWR5LXN0YXRlIGFidW5kYW5jZSBvZiBwcm90ZWluIHZhcmlhbnRzIGluIGN1bHR1cmVkIGh1bWFuIGNlbGxzIChlYWNoIGNlbGwgZXhwcmVzc2VzIGEgc2luZ2xlIHZhcmlhbnQgZGlyZWN0bHkgZnVzZWQgdG8gRUdGUC4uLnRoZSBzdGFiaWxpdHkgb2YgdGhlIHZhcmlhbnQgZGljdGF0ZXMgdGhlIGFidW5kYW5jZSBvZiB0aGUgRUdGUCBmdXNpb24gYW5kLCBhY2NvcmRpbmdseSwgdGhlIGdyZWVuIGZsdW9yZXNjZW5jZSBzaWduYWwgb2YgdGhlIGNlbGwpCi0gdXNlZCB0byBhc3Nlc3MgUFRFTiBhbmQgVFBNVCB2YXJpYW50cyAKYGBge3IgZWNobz1GQUxTRX0KcGFyKHBjaD0yMCwgY2V4PS42KQojbG9jYWwKI3NvdXJjZSA9IGh0dHBzOi8vd3d3Lm5hdHVyZS5jb20vYXJ0aWNsZXMvczQxNTg4LTAxOC0wMTIyLXosIFN1cHBsZW1lbnRhcnkgRGF0YXNldCAxLCAyCnB0ZW4xX2RhdGEgPC0gcmVhZC5kZWxpbSgnfi9sZWtsYWIvbGVrbGFiL3B0ZW4xLnR4dCcpCnRwbXQxX2RhdGEgPC0gcmVhZC5kZWxpbSgnfi9sZWtsYWIvbGVrbGFiL3RwbXRfc3VwcGxfMi50eHQnKQoKI3Byb2Nlc3NlZCB2ZXJzb24gd2hlcmUgcm93cyB3aXRoIGFidW5kYW5jZSBjbGFzcyA9IE5BIGFyZSBkZWxldGVkCnB0ZW4xX3Byb2MgPC0gcHRlbjFfZGF0YVshaXMubmEocHRlbjFfZGF0YSRhYnVuZGFuY2VfY2xhc3MpLF0KdHBtdDFfcHJvYyA8LSB0cG10MV9kYXRhWyFpcy5uYSh0cG10MV9kYXRhJGFidW5kYW5jZV9jbGFzcyksXQpgYGAKYGBge3IgZWNobz1GQUxTRX0KIyBCb3hwbG90IG9mIGFidW5kYW5lIHNjb3JlcyB2cyBhYnVuZGFuY2UgY2xhc3MgKGxvdywgcG9zc2libHkgbG93LCBldGMpIGZvciBQVEVOIGFuZCBUUE1UCmRkIDwtIGRhdGEuZnJhbWUocHRlbjFfcHJvYyRhYnVuZGFuY2VfY2xhc3MscHRlbjFfcHJvYyRzY29yZSkKY29sbmFtZXMoZGQpIDwtIGMoImFidW5kYW5jZV9jbGFzcyIsICJzY29yZSIpCmVlIDwtIGRhdGEuZnJhbWUodHBtdDFfcHJvYyRhYnVuZGFuY2VfY2xhc3MsdHBtdDFfcHJvYyRzY29yZSkKY29sbmFtZXMoZWUpIDwtIGMoImFidW5kYW5jZV9jbGFzcyIsICJzY29yZSIpCmRkJHByb3RlaW4gPC0gcmVwKCJQVEVOIiwgbnJvdyhkZCkpCmVlJHByb3RlaW4gPC0gcmVwKCJUUE1UIiwgbnJvdyhlZSkpCmZmID0gZGF0YS5mcmFtZShyYmluZChkZCwgZWUpKQpiYnBwID0gYm94cGxvdChzY29yZX5wcm90ZWluK2FidW5kYW5jZV9jbGFzcywgZGF0YSA9IGZmLCBhdCA9IGMoMSwgMS44LCAzLCAzLjgsIDUsIDUuOCwgNy4yLCA4KSwgeGF4dD0nbicsIGNvbCA9IGMoJ3doaXRlJywgJ2dyYXknKSkKYXhpcyhzaWRlPTEsIGF0PWMoMS40LCAzLjQsIDUuNCwgNy42KSwgbGFiZWxzPWMoJ2xvdycsICdwb3NzaWJseSBsb3cnLCAncG9zc2libHlcbiB3dC1saWtlJywgJ3d0LWxpa2UnKSkKdGl0bGUoJ1ZBTVAtc2VxIHNjb3JlcyBvZiBQVEVOIGFuZCBUUE1UIFZhcmlhbnRzXG5hbmQgYWJ1bmRhbmNlIGNsYXNzJykKYGBgCgpgYGB7ciBlY2hvPUZBTFNFfQojIFZpb2xpbiBQbG90IHZlcnNpb24gb2YgYWJvdmUKVkFNUF9hYnVuZGFuY2UgPC0gZ2dwbG90KGZmLCBhZXMoeD1hYnVuZGFuY2VfY2xhc3MsIHk9c2NvcmUsIGZpbGw9cHJvdGVpbikpICsgZ2VvbV92aW9saW4oZHJhd19xdWFudGlsZXMgPSAwLjUpK3lsYWIoIlZBTVAtc2VxIHNjb3JlIikreGxhYigiQWJ1bmRhbmNlIENsYXNzIikrdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSwgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiZ3JleSIpLCBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJncmV5IikpK2dndGl0bGUoIlZBTVAtc2VxIHNjb3JlcyBmb3IgZWFjaCBhYnVuZGFuY2UgY2xhc3NpZmljYXRpb24iKStnZW9tX3BvaW50KGRhdGE9ZGF0YS5mcmFtZSh4PSJ3dC1saWtlIiwgeT0xLCBwcm90ZWluID0gIlBURU4iKSwgYWVzKHgseSksIGNvbG91cj0iYmxhY2siLCBzaXplPTEuNSwgc2hvdy5sZWdlbmQ9RkFMU0UpK2Fubm90YXRlKCJ0ZXh0IiwgeCA9ICJ3dC1saWtlIiwgeT0xLjA5LCBsYWJlbCA9ICJXVCIsY29sb3VyPSAiYmxhY2siLCBzaXplID0gNCkgKyBzY2FsZV95X2NvbnRpbnVvdXMobWlub3JfYnJlYWtzID0gc2VxKC0yLCAyLCAuMjUpKSt0aGVtZV9idygpCnBsb3QoVkFNUF9hYnVuZGFuY2UpCmBgYAoKYGBge3IgZWNobz1GQUxTRX0KI2NvbWJpbmluZyBwdGVuMV9kYXRhIGFuZCB0cG10MV9kYXRhIGludG8gb25lIGxhcmdlIGRhdGEgZnJhbWUsIGRpZmZlcmVudGlhdGUgYmV0d2VlbiB0aGUgdHdvIHcvIGNvbHVtbiAncHJvdGVpbicgd2hpY2ggc3BlY2lmaWVzICdQVEVOJyBvciAnVFBNVCcKcHRlbjFfZGF0YSRwcm90ZWluIDwtIHJlcCgiUFRFTiIsIG5yb3cocHRlbjFfZGF0YSkpCnRwbXQxX2RhdGEkcHJvdGVpbiA8LSByZXAoIlRQTVQiLCBucm93KHRwbXQxX2RhdGEpKQpjb21tb25fY29scyA8LSBpbnRlcnNlY3QoY29sbmFtZXMocHRlbjFfZGF0YSksIGNvbG5hbWVzKHRwbXQxX2RhdGEpKQpjb21iX2RhdGEgPSByYmluZChzdWJzZXQocHRlbjFfZGF0YSwgc2VsZWN0ID0gY29tbW9uX2NvbHMpLCBzdWJzZXQodHBtdDFfZGF0YSwgc2VsZWN0ID0gY29tbW9uX2NvbHMpKQoKI3Bsb3RzIGhlbGl4IHZzIHNjb3JlIGZvciBQVEVOIGFuZCBUUE1UIHNpZGUgYnkgc2lkZQojZ2V0dGluZyByaWQgb2Ygcm93cyB3aXRoIE5BIGluIGhlbGl4IGNvbHVtbgpjb21iX2RhdGFfaGVsaXggPC0gY29tYl9kYXRhWyFpcy5uYShjb21iX2RhdGEkaGVsaXgpLF0KY29tYl9kYXRhX3NoZWV0IDwtIGNvbWJfZGF0YVshaXMubmEoY29tYl9kYXRhJHNoZWV0KSxdCiN1bmVjZXNzYXJ5IHN0ZXAgKGdldHMgcmlkIG9mIHJvdyByZW1vdmFsIHdhcm5pbmcgd2hlbiBwbG90dGluZykKY2sgPC0gY29tYl9kYXRhX2hlbGl4WyFpcy5uYShjb21iX2RhdGFfaGVsaXgkYWJ1bmRhbmNlX2NsYXNzKSxdCmNrMSA8LSBjb21iX2RhdGFfc2hlZXRbIWlzLm5hKGNvbWJfZGF0YV9zaGVldCRhYnVuZGFuY2VfY2xhc3MpLF0KCiNWaW9saW4gcGxvdHMgb2YgUFRFTiBhbmQgVFBNVCB2YXJpYW50IGFidW5kYW5jZSBzY29yZXMgZ3JvdXBlZCBieSBzZWNvbmRhcnkgc3RydWN0dXJlCmhfcGxvdCA8LSBnZ3Bsb3QoY2ssIGFlcyh4PWFzLmZhY3RvcihoZWxpeCksIHk9c2NvcmUsIGZpbGw9cHJvdGVpbikpICsgZ2VvbV92aW9saW4oZGF0YT1zdWJzZXQoY2ssIGhlbGl4PT0xKSwgZHJhd19xdWFudGlsZXMgPSBjKDAuNSkpICsgZ3VpZGVzKGZpbGw9RkFMU0UpICsgeGxhYigiQWxwaGEgSGVsaXgiKSArIHlsYWIoIlZBTVAtc2VxIHNjb3JlIikgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSkgKyBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtLjcsIDIuMDMpKQoKc19wbG90IDwtIGdncGxvdChjazEsIGFlcyh4PWFzLmZhY3RvcihzaGVldCksIHk9c2NvcmUsIGZpbGw9cHJvdGVpbikpICsgZ2VvbV92aW9saW4oZGF0YT1zdWJzZXQoY2sxLCBzaGVldD09MSksIGRyYXdfcXVhbnRpbGVzID0gYygwLjUpKSArICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLCBheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSkgKyB4bGFiKCJCZXRhIFNoZWV0IikgKyBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtLjcsIDIuMDMpKSArIGd1aWRlcyhmaWxsPUZBTFNFKSAKCm5fcGxvdCA8LSBnZ3Bsb3QoY2ssIGFlcyh4PWFzLmZhY3RvcihoZWxpeCksIHk9c2NvcmUsIGZpbGw9cHJvdGVpbikpICsgZ2VvbV92aW9saW4oZGF0YT1zdWJzZXQoY2ssIGhlbGl4PT0wICYgc2hlZXQ9PTApLCBkcmF3X3F1YW50aWxlcyA9IGMoIDAuNSkpICsgdGhlbWUoIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksIGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLCBsZWdlbmQuanVzdGlmaWNhdGlvbj1jKDEsMCksIGxlZ2VuZC5wb3NpdGlvbj1jKC40OSwuNzUpLCBsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpLCBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTEwKSkgKyB4bGFiKCJPdGhlciIpICsgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLS43LCAyLjAzKSkKCiNwdXQgdGhlIHBsb3RzIHNpZGUgYnkgc2lkZQpjb21iaW5lZCA8LSBncmlkLmFycmFuZ2UoaF9wbG90LCBzX3Bsb3QsIG5fcGxvdCwgbmNvbD0zLCB0b3AgPSAiVmFyaWFudCBzY29yZXMgaW4gcmVsYXRpb24gdG8gcG9zaXRpb24gaW4gcHJvdGVpbiIpCiMjIyMjIyMjIyMjIyMjCiMjc2F2ZSBhcyBwZGYKCiMgcGRmKCJ2aW9saW5fVmFyaWFudF9zY29yZXNfdnMucGRmIikKIyBwbG90KGNvbWJpbmVkKQojIHBsb3QoVkFNUF9hYnVuZGFuY2UpCiMgZGV2Lm9mZigpCiMjIyMjIyMjIyMjIyMjCiN3b3JrcyB0byBzYXZlIHNpbmdsZSBwbG90CiNnZ3NhdmUoIlZhcmlhbnRfc2NvcmVzX3Byb3RlaW5fcG9zaXRpb24ucGRmIiwgcGxvdCA9IGNvbWJpbmVkLCBkZXZpY2UgPSAicGRmIiwgcGF0aCA9ICIvVXNlcnMvZ28yYWx5c3NhL0Rlc2t0b3AvIiwgc2NhbGUgPSAyLjYsIGRwaSA9ICJyZXRpbmEiKQoKYGBgCgpgYGB7cn0KIyBTY2F0dGVyIHBsb3Qgb2YgVkFNUC1zZXEgc2NvcmVzIHJlbGF0aXZlIHRvIHZhcmlhbnQgcG9zaXRpb24gaW4gcHJvdGVpbiwgY29sb3JlZCBieSBzZWNvbmRhcnkgc3RydWN0CgojZXNzZW50aWFsbHkgZ2V0dGluZyByaWQgb2YgdGhlIGxhc3Qgcm93ICh3dCkKcHRlbjFfcHJvY193dCA8LSBwdGVuMV9wcm9jWyFpcy5uYShwdGVuMV9wcm9jJHBvc2l0aW9uKSxdCgojY3JlYXRpbmcgbmV3IGNvbHVtbiB0aGF0IHNwZWNpZmljZXMgc2Vjb25kYXJ5IHN0cnVjdHVyZSAodXNlcyBpbmZvIGZyb20gaGVsaXggYW5kIHNoZWV0IGNvbHVtbnMpCnB0ZW4xX3Byb2Nfd3Qkc2Vjb25kYXJ5X3N0cnVjdCA8LSBpZmVsc2UoaXMubmEocHRlbjFfcHJvY193dCRoZWxpeCksICJ1bmtub3duIiwKICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHB0ZW4xX3Byb2Nfd3QkaGVsaXg9PTEsICJoZWxpeCIsCiAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShwdGVuMV9wcm9jX3d0JHNoZWV0PT0xLCAic2hlZXQiLAogICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UocHRlbjFfcHJvY193dCRoZWxpeD09MCwgIm5laXRoZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAidW5rbm93biIpKSkpCgpwdGVuX3BvcyA8LSBnZ3Bsb3QocHRlbjFfcHJvY193dCwgYWVzKHg9cG9zaXRpb24sIHk9c2NvcmUsIGNvbG91cj1zZWNvbmRhcnlfc3RydWN0KSkrIGdlb21fcG9pbnQoc2l6ZT0uMykgKyBzY2FsZV94X2NvbnRpbnVvdXMobWlub3JfYnJlYWtzID0gc2VxKDAsIDQyMCwgNSkpICsgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCIjRkY0ODQ4IiwgIiMwMEM4NTMiLCAiIzU3NTdGRiIsICIjQTlBOUE5IikpICt5bGFiKCJWQU1QLXNlcSBzY29yZSIpK3hsYWIoIlBvc2l0aW9uIGluIFBURU4iKStsYWJzKGNvbG91cj0iU2Vjb25kYXJ5IFN0cnVjdHVyZSIpK2dndGl0bGUoIlBURU4gc2NvcmVzIGluIHJlbGF0aW9uIHRvIHByb3RlaW4gc3RydWN0dXJlIikKIysgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTI3LCBjb2xvcj0iYmxhY2siLCBzaXplPS4xKSArIGdlb21fdmxpbmUoeGludGVyY2VwdD01NSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0uMSkgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9NzAsIGNvbG9yPSJibGFjayIsIHNpemU9LjEpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTg1LCBjb2xvcj0iYmxhY2siLCBzaXplPS4xKSArIGdlb21fdmxpbmUoeGludGVyY2VwdD0xNjQuNSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0uMSkgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MjEyLCBjb2xvcj0iYmxhY2siLCBzaXplPS4xKSArIGdlb21fdmxpbmUoeGludGVyY2VwdD0yNjcuNSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0uMSkgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MzQzLjUsIGNvbG9yPSJibGFjayIsIHNpemU9LjEpK3RoZW1lX2J3KCkKCiNhbGwgdGhlIGdlb21fdmxpbmVzIGRlbm90ZWQgZXhvbiBib3VuZGFyaWVzLCBob3dldmVyLCBiYXNlZCBvbiBob3cgdGhlIHZhcmlhbnQgcHJvdGVpbnMgd2VyZSBwcm9kdWNlZCBieSB0aGUgbGFiIChubyBzcGxpY2luZyBpbnZvbGVkKSwgSSBkZWNpZGVkIHRvIHJlbW92ZSB0aGVzZSBtYXJrZXJzCgojY29sb3JlZCBieSBjaGFuZ2UgaW4gaHlkcm9waG9iaWNpdHkgaW5zdGVhZCBvZiBzZWNvbmRhcnkgc3RydWN0CnB0ZW5faHlkcm8gPC0gZ2dwbG90KHB0ZW4xX3Byb2Nfd3QsIGFlcyh4PXBvc2l0aW9uLCB5PXNjb3JlLCBjb2xvdXI9KGh5ZHJvMi1oeWRybzEpKSkrIGdlb21fcG9pbnQoc2l6ZT0uMywgYWxwaGEgPSAwLjMpICsgc2NhbGVfeF9jb250aW51b3VzKG1pbm9yX2JyZWFrcyA9IHNlcSgwLCA0MjAsIDUpKSArIHlsYWIoIlZBTVAtc2VxIHNjb3JlIikreGxhYigiUG9zaXRpb24gaW4gUFRFTiIpK2xhYnMoY29sb3VyPSJIeWRyb3Bob2JpY2l0eSIpK2dndGl0bGUoIlBURU4gc2NvcmVzIGluIHJlbGF0aW9uIHRvIGNoYW5nZSBpbiBoeWRyb3Bob2JpY2l0eSIpIAoKI3JlcGVhdCBmb3IgdHBtdAp0cG10MV9wcm9jX3d0IDwtIHRwbXQxX3Byb2NbIWlzLm5hKHRwbXQxX3Byb2MkcG9zaXRpb24pLF0KdHBtdDFfcHJvY193dCRzZWNvbmRhcnlfc3RydWN0IDwtIGlmZWxzZShpcy5uYSh0cG10MV9wcm9jX3d0JGhlbGl4KSwgInVua25vd24iLAogICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UodHBtdDFfcHJvY193dCRoZWxpeD09MSwgImhlbGl4IiwKICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHRwbXQxX3Byb2Nfd3Qkc2hlZXQ9PTEsICJzaGVldCIsCiAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh0cG10MV9wcm9jX3d0JGhlbGl4PT0wLCAibmVpdGhlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ1bmtub3duIikpKSkKdHBtdF9wb3MgPC0gZ2dwbG90KHRwbXQxX3Byb2Nfd3QsIGFlcyh4PXBvc2l0aW9uLCB5PXNjb3JlLCBjb2xvdXI9c2Vjb25kYXJ5X3N0cnVjdCkpKyBnZW9tX3BvaW50KHNpemU9LjMpICsgc2NhbGVfeF9jb250aW51b3VzKG1pbm9yX2JyZWFrcyA9IHNlcSgwLCA0MDUsIDUpKSArIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiI0ZGNDg0OCIsICIjMDBDODUzIiwgIiM1NzU3RkYiLCAiI0E5QTlBOSIpKSAreWxhYigiVkFNUC1zZXEgc2NvcmUiKSt4bGFiKCJQb3NpdGlvbiBpbiBUUE1UIikrbGFicyhjb2xvdXI9IlNlY29uZGFyeSBTdHJ1Y3R1cmUiKStnZ3RpdGxlKCJUUE1UIHNjb3JlcyBpbiByZWxhdGlvbiB0byBwcm90ZWluIHN0cnVjdHVyZSIpIAojKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9NDcsIGNvbG9yPSJibGFjayIsIHNpemU9LjEpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTc4LCBjb2xvcj0iYmxhY2siLCBzaXplPS4xKSArIGdlb21fdmxpbmUoeGludGVyY2VwdD0xMjIuNSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0uMSkgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MTQwLCBjb2xvcj0iYmxhY2siLCBzaXplPS4xKSArIGdlb21fdmxpbmUoeGludGVyY2VwdD0xNjUsIGNvbG9yPSJibGFjayIsIHNpemU9LjEpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTE5NCwgY29sb3I9ImJsYWNrIiwgc2l6ZT0uMSkgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MjA5LCBjb2xvcj0iYmxhY2siLCBzaXplPS4xKQoKI2NyZWF0aW5nIGEgY29weSBvZiB0cG10MV9wcm9jX3d0LCBhZGRpdGlvbiBvZiBjb2x1bW4gdGhhdCBub3RlcyBjaGFuZ2UgZnJvbSBvbmUgc2Vjb25kYXJ5IHN0cnVjdCB0byBhbm90aGVyIChmb3IgdmlvbGluIHBsb3QgcHVycG9zZXMpIChwbG90IHRwbXRfcG9zX3ZwIHRvIHNlZSkKdHBtdF9jb2xvcnMgPC0gdHBtdDFfcHJvY193dAp0cG10X2NvbG9ycyRmYWN0IDwtIHJlcCgxMCwgbnJvdyh0cG10X2NvbG9ycykpCnRlbXAgPC0gMQpmb3IoaSBpbiAxOihsZW5ndGgodHBtdF9jb2xvcnMkZmFjdCktMSkpIHsKICBpZiAodHBtdF9jb2xvcnMkc2Vjb25kYXJ5X3N0cnVjdFtpXSAhPSB0cG10X2NvbG9ycyRzZWNvbmRhcnlfc3RydWN0W2krMV0pIHsKICAgIHRwbXRfY29sb3JzJGZhY3RbaV0gPC0gdGVtcAogICAgdGVtcCA8LSB0ZW1wICsgMQogIH0gZWxzZSB7CiAgdHBtdF9jb2xvcnMkZmFjdFtpXSA8LSB0ZW1wCiAgfQp9CnRwbXRfY29sb3JzJGZhY3RbbGVuZ3RoKHRwbXRfY29sb3JzJGZhY3QpXSA8LSB0ZW1wCgoKdHBtdF9wb3NfdnAgPC0gZ2dwbG90KHRwbXRfY29sb3JzLCBhZXMoeD1wb3NpdGlvbiwgeT1zY29yZSkpKyBnZW9tX3Zpb2xpbihkYXRhPXRwbXRfY29sb3JzW2MoMToyNzgzLCAyNzk4OjQwMDApLF0sIGFlcyhmaWxsPWFzLmNoYXJhY3RlcihmYWN0KSwgY29sb3VyID0gZmFjdG9yKFRSVUUpKSwgZHJhd19xdWFudGlsZXMgPSBjKDAuNSksIHNjYWxlID0gIndpZHRoIikgKyAKc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIjEiID0gIiNBOUE5QTkiLCAiMiIgPSAiIzAwQzg1MyIsICIzIiA9ICIjRkY0ODQ4IiwgIjQiID0gIiMwMEM4NTMiLCI1IiA9ICIjRkY0ODQ4IiwgIjYiID0gIiMwMEM4NTMiLCI3IiA9ICIjNTc1N0ZGIiwgIjgiID0gIiMwMEM4NTMiLCI5IiA9ICIjRkY0ODQ4IiwiMTAiID0gIiMwMEM4NTMiLCIxMSIgPSAiIzU3NTdGRiIsICIxMiIgPSAiIzAwQzg1MyIsIjEzIiA9ICIjRkY0ODQ4IiwgIjE0IiA9ICIjMDBDODUzIiwgIjE1IiA9ICIjNTc1N0ZGIiwgIjE2IiA9ICIjMDBDODUzIiwgIjE3IiA9ICIjNTc1N0ZGIiwgIjE4IiA9ICIjMDBDODUzIiwgIjE5IiA9ICIjNTc1N0ZGIiwgIjIwIiA9ICIjMDBDODUzIiwgIjIxIiA9ICIjNTc1N0ZGIiwgIjIyIiA9ICIjMDBDODUzIiwgIjIzIiA9ICIjRkY0ODQ4IiwgIjI0IiA9ICIjNTc1N0ZGIiwgIjI1IiA9ICIjMDBDODUzIiwgIjI2IiA9ICIjRkY0ODQ4IiwgIjI3IiA9ICIjMDBDODUzIiwgIjI4IiA9ICIjNTc1N0ZGIiwgIjI5IiA9ICIjMDBDODUzIiwgIjMwIiA9ICIjNTc1N0ZGIiwgIjMxIiA9ICIjMDBDODUzIikpICsgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJibGFjayIpKSArIHNjYWxlX3hfY29udGludW91cyhtaW5vcl9icmVha3MgPSBzZXEoMCwgNDA1LCA1KSkgKyB5bGFiKCJWQU1QLXNlcSBzY29yZSIpK3hsYWIoIlBvc2l0aW9uIGluIFRQTVQiKStsYWJzKGNvbG91cj0iU2Vjb25kYXJ5IFN0cnVjdHVyZSIpK2dndGl0bGUoIlRQTVQgc2NvcmVzIGluIHJlbGF0aW9uIHRvIHByb3RlaW4gc3RydWN0dXJlIikKCiMgU2NhdHRlciBwbG90IHdpdGggY2hhbmdlIG9mIGh5ZHJvcGhvYmljaXR5IGFsb25nIHgtYXhpcywgYWJ1bmRhbmNlIHNjb3JlIGFsb25nIHkKcHRlbl9oeWRybzEgPC0gZ2dwbG90KHB0ZW4xX3Byb2Nfd3QsIGFlcyh5PXNjb3JlLCB4PShoeWRybzItaHlkcm8xKSkpKyBnZW9tX3BvaW50KHNpemU9MC41LCBhbHBoYSA9IDAuMykgKyB5bGFiKCJIeWRyb3Bob2JpY2l0eSIpK3hsYWIoIlZBTVAtc2VxIHNjb3JlIikrZ2d0aXRsZSgiUFRFTiBzY29yZXMgaW4gcmVsYXRpb24gdG8gY2hhbmdlIGluIGh5ZHJvcGhvYmljaXR5IikKCiMgVmlvbGluIGFuZCBzY2F0dGVyIHBsb3RzIG9mIHZhcmlhbnQgYW1pbm8gYWNpZCBzY29yZSBzcHJlYWQgKGNsdXN0ZXJlZCBieSB2YXJpYW50KQpwdGVuX2FhX3NwcmVhZCA8LSBnZ3Bsb3QocHRlbjFfcHJvY193dCwgYWVzKHk9c2NvcmUsIHg9ZW5kKSkgKyBnZW9tX3Zpb2xpbihkcmF3X3F1YW50aWxlcz1jKDAuNSkpCnB0ZW5fYWFfc3ByZWFkMSA8LSBnZ3Bsb3QocHRlbjFfcHJvY193dCwgYWVzKHk9c2NvcmUsIHg9ZW5kKSkgKyBnZW9tX3BvaW50KHNpemUgPSAwLjUsIGFscGhhID0gMC4zLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcih3aWR0aCA9IDAuMSwgaGVpZ2h0ID0gTlVMTCkpCgpwbG90KHB0ZW5fcG9zKQpwbG90KHRwbXRfcG9zKQoKI3Bsb3QodHBtdF9wb3NfdnApCiNwbG90KHB0ZW5faHlkcm8pCiNwbG90KHB0ZW5faHlkcm8xKQpwbG90KHB0ZW5fYWFfc3ByZWFkKQpwbG90KHB0ZW5fYWFfc3ByZWFkMSkKYGBgCmBgYHtyfQojIExvb2tpbmcgZm9yIHBvc3NpYmxlIGNvcnJlbGF0aW9uIGJldHdlZW4gYWJ1bmRhbmNlIGFuZCBoeWRyb2dlbiBib25kaW5nCiMgcHJlcHJvY2Vzc2luZyBkYXRhIChwcm9iYWJseSB1bmVjZXNzYXJ5LCByZW1vdmVzIHJvd3Mgd2l0aCBOQSBpbiBoYm9uZF9zdW0sIGFkZHMgY29sdW1uIHRoYXQgb25jZSBhZ2FpbiBkZW5vdGVzIHNlY29uZGFyeSBzdHJ1Y3R1cmUpCnB0ZW4xX2hib25kIDwtIHB0ZW4xX3Byb2NbIWlzLm5hKHB0ZW4xX3Byb2MkaGJvbmRfc3VtKSxdCnB0ZW4xX2hib25kJHNlY29uZGFyeV9zdHJ1Y3QgPC0gaWZlbHNlKGlzLm5hKHB0ZW4xX2hib25kJGhlbGl4KSwgInVua25vd24iLAogICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UocHRlbjFfaGJvbmQkaGVsaXg9PTEsICJoZWxpeCIsCiAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShwdGVuMV9oYm9uZCRzaGVldD09MSwgInNoZWV0IiwKICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHB0ZW4xX2hib25kJGhlbGl4PT0wLCAibmVpdGhlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ1bmtub3duIikpKSkKCiMgU2NhdHRlciBvZiBhYnVuZGFuY2Ugc2NvcmUgdnMgaGJvbmRfc3VtIChjb2xvcmVkIGJ5IHNlY29uZGFyeSBzdHJ1Y3QpCnB0ZW5fcGxvdF9oYm9uZCA8LSBnZ3Bsb3QocHRlbjFfaGJvbmQsIGFlcyh4PWhib25kX3N1bSwgeT1zY29yZSwgY29sb3VyPXNlY29uZGFyeV9zdHJ1Y3QpKSsgZ2VvbV9wb2ludChhbHBoYT0wLjQpICsgeWxhYigiVkFNUC1zZXEgc2NvcmUiKSt4bGFiKCJEU1NQIFN1bSBvZiBoeWRyb2dlbiBib25kcyIpK2dndGl0bGUoIlBURU4gc2NvcmVzIGluIHJlbGF0aW9uIHRvIGh5ZHJvZ2VuIGJvbmRpbmciKSArIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiI0ZGNDg0OCIsICIjNjk2OTY5IiwgIiM1NzU3RkYiKSkgKyBsYWJzKGNvbG91cj0iU2Vjb25kYXJ5IFN0cnVjdHVyZSIpICsgdGhlbWVfYncoKQoKcGxvdChwdGVuX3Bsb3RfaGJvbmQpCgojICh1bmNvbG9yZWQpCnB0ZW5fcGxvdF9oYm9uZDEgPC0gZ2dwbG90KHB0ZW4xX2hib25kLCBhZXMoeD1oYm9uZF9zdW0sIHk9c2NvcmUpKSsgZ2VvbV9wb2ludChhbHBoYSA9IDAuMikgKyB5bGFiKCJWQU1QLXNlcSBzY29yZSIpK3hsYWIoIkRTU1AgU3VtIG9mIGh5ZHJvZ2VuIGJvbmRzIikrZ2d0aXRsZSgiUFRFTiBzY29yZXMgaW4gcmVsYXRpb24gdG8gaHlkcm9nZW4gYm9uZGluZyIpICsgdGhlbWVfYncoKQoKcGxvdChwdGVuX3Bsb3RfaGJvbmQxKQoKI3JlcGVhdCBmb3IgdHBtdAp0cG10MV9oYm9uZCA8LSB0cG10MV9wcm9jWyFpcy5uYSh0cG10MV9wcm9jJGhib25kX3N1bSksXQp0cG10MV9oYm9uZCRzZWNvbmRhcnlfc3RydWN0IDwtIGlmZWxzZShpcy5uYSh0cG10MV9oYm9uZCRoZWxpeCksICJ1bmtub3duIiwKICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHRwbXQxX2hib25kJGhlbGl4PT0xLCAiaGVsaXgiLAogICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UodHBtdDFfaGJvbmQkc2hlZXQ9PTEsICJzaGVldCIsCiAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh0cG10MV9oYm9uZCRoZWxpeD09MCwgIm5laXRoZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAidW5rbm93biIpKSkpCgp0cG10X3Bsb3RfaGJvbmQgPC0gZ2dwbG90KHRwbXQxX2hib25kLCBhZXMoeD1oYm9uZF9zdW0sIHk9c2NvcmUsIGNvbG91cj1zZWNvbmRhcnlfc3RydWN0KSkrIGdlb21fcG9pbnQoYWxwaGE9MC40KSArIHlsYWIoIlZBTVAtc2VxIHNjb3JlIikreGxhYigiRFNTUCBTdW0gb2YgaHlkcm9nZW4gYm9uZHMiKStnZ3RpdGxlKCJQVEVOIHNjb3JlcyBpbiByZWxhdGlvbiB0byBoeWRyb2dlbiBib25kaW5nIikgKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoIiNGRjQ4NDgiLCAiIzY5Njk2OSIsICIjNTc1N0ZGIikpICsgbGFicyhjb2xvdXI9IlNlY29uZGFyeSBTdHJ1Y3R1cmUiKSArIHRoZW1lX2J3KCkKCnBsb3QodHBtdF9wbG90X2hib25kKQoKdHBtdF9wbG90X2hib25kMSA8LSBnZ3Bsb3QodHBtdDFfaGJvbmQsIGFlcyh4PWhib25kX3N1bSwgeT1zY29yZSkpKyBnZW9tX3BvaW50KGFscGhhID0gMC4yKSArIHlsYWIoIlZBTVAtc2VxIHNjb3JlIikreGxhYigiRFNTUCBTdW0gb2YgaHlkcm9nZW4gYm9uZHMiKStnZ3RpdGxlKCJUUE1UIHNjb3JlcyBpbiByZWxhdGlvbiB0byBoeWRyb2dlbiBib25kaW5nIikgKyB0aGVtZV9idygpCgpwbG90KHRwbXRfcGxvdF9oYm9uZDEpCgojbGVzcyBoeWRyb2dlbiBib25kcyB+IGhpZ2hlciBhYnVuZGFuY2UKYGBgCmBgYHtyIGluY2x1ZGU9RkFMU0V9CiMgVG8gY3JlYXRlIG11bHRpdHJhY2sgKGhlYXQgbWFwLCBtZWFuLXZhcmlhbmNlLCBzZWNvbmRhcnkgc3RydWN0KQojdG8gY2FsY3VsYXRlIG1lYW4gYW5kIHZhcmlhbmNlIGZvciBlYWNoIHBvc2l0aW9uJ3MgdmFyaWFudHMnIGFidW5kYW5jZSBzY29yZXMgCnRwbXRfc3VtIDwtIHN1bW1hcnlTRSh0cG10MV9wcm9jX3d0LCBtZWFzdXJldmFyPSJzY29yZSIsIGdyb3VwdmFycz0icG9zaXRpb24iKQoKIyBNZWFuLXZhcmlhbmNlIHBsb3QKdHBtdF9wb3NfbWVhbiA8LSBnZ3Bsb3QodHBtdF9zdW0sIGFlcyh4PXBvc2l0aW9uLCB5PXNjb3JlKSkrIGdlb21fYmFyKHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKCksIHN0YXQ9ImlkZW50aXR5IiwgY29sb3VyPSIjOTk5OTk5IikgKyBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPXNjb3JlLXNkLCB5bWF4ID0gc2NvcmUrc2QpLCB3aWR0aD0xLCBzaXplPTAuMywgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoKSkgK3lsYWIoIlZBTVAtc2VxIHNjb3JlIikrdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLCBheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSkgKyBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDI0NSwgMTApLCBleHBhbmQgPSBjKDAsMCkpICsgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSkKCiMgSGVhdCBwbG90CnRwbXRfaGVhdCA8LSBnZ3Bsb3QodHBtdDFfcHJvY193dCwgYWVzKHBvc2l0aW9uLCBlbmQpKSArIGdlb21fdGlsZShhZXMoZmlsbD1zY29yZSkpICsgc2NhbGVfZmlsbF9ncmFkaWVudG4oY29sb3VycyA9IGMoIiMzRjdDQjkiLCAiI0ZGRUFGMyIsICIjQjIxRjRFIiksIHZhbHVlcyA9IHNjYWxlczo6cmVzY2FsZShjKC0wLjcsIDAuMiwgMSwgMS4zLCAyLjAzKSkpKyBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDI0NSwgMTApLCBleHBhbmQ9YygwLDApKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0nYm90dG9tJykreGxhYigiUG9zaXRpb24gaW4gVFBNVCIpICsgc2NhbGVfeV9kaXNjcmV0ZShleHBhbmQgPSBjKDAsMCkpCiNzY2FsZV9maWxsX2dyYWRpZW50Mihsb3c9IiMzRjdDQjkiLCBtaWQ9IndoaXRlIiwgaGlnaD0iI0IyMUY0RSIsIG1pZHBvaW50PTEpIAojc2NhbGVfZmlsbF9kaXN0aWxsZXIocGFsZXR0ZT0gIlJkQnUiKQoKIyBTZWNvbmRhcnkgc3RydWN0IChhbHRlcmVkIGZyb20gRm93bGVyTGFiL1ZBTVBzZXEgZ2l0aHViKQp0cG10X2Rzc3Bfc2NoZW1hdGljIDwtIGdncGxvdCgpICsgZ2d0aXRsZSgiVFBNVCBtZWFuIGFidW5kYW5jZSBzY29yZXMiKSArCiAgZ2VvbV9zZWdtZW50KGFlcyh4ID0gMSwgeSA9IDAsIHhlbmQgPSBtYXgodHBtdDFfZGF0YSRwb3NpdGlvbikpLCB5ZW5kID0gMCwgc2l6ZSA9IDEsIGNvbG9yID0gImdyZXk3MCIpICsKICBnZW9tX3BvaW50KGRhdGEgPSB0cG10MV9kYXRhLCBhZXMoeCA9IHBvc2l0aW9uLCB5ID0gMCksIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEuOCkgKwogIGdlb21fcG9pbnQoZGF0YSA9IHN1YnNldCh0cG10MV9kYXRhLCBzaGVldCA9PSAxKSwgYWVzKHggPSBwb3NpdGlvbiwgeSA9IDApLCBjb2xvciA9ICJwaW5rIiwgc2l6ZSA9IDEuNSkgKwogIGdlb21fcG9pbnQoZGF0YSA9IHN1YnNldCh0cG10MV9kYXRhLCBoZWxpeCA9PSAxKSwgYWVzKHggPSBwb3NpdGlvbiwgeSA9IDApLCBjb2xvciA9ICJjeWFuIiwgc2l6ZSA9IDEuNSkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMjQ1LCAxMCksIGV4cGFuZCA9IGMoMCwwKSkgKwogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBOVUxMLCBleHBhbmQgPSBjKDAsMCkpICt4bGFiKE5VTEwpICsgeWxhYihOVUxMKSArCiAgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9ibGFuaygpLCBheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCkpCgojcGxvdHMKcGxvdCh0cG10X3Bvc19tZWFuKQpwbG90KHRwbXRfaGVhdCkKdHBtdF9kc3NwX3NjaGVtYXRpYwoKCiNncm91cGluZyBhbGwgdmFyaWFudHMgaW4gdGhlIHNhbWUgc2Vjb25kYXJ5IHN0cnVjdHVyZSB0b2dldGhlcgojdHBtdF9hYV9zdW0gPC0gc3VtbWFyeVNFKHRwbXRfY29sb3JzLCBtZWFzdXJldmFyPSJzY29yZSIsIGdyb3VwdmFycz0iZmFjdCIpCiN0cG10X2FhX21lYW4gPC0gZ2dwbG90KHRwbXRfYWFfc3VtLCBhZXMoeD1mYWN0LCB5PXNjb3JlKSkrIGdlb21fYmFyKHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKCksIHN0YXQ9ImlkZW50aXR5IiwgY29sb3VyPSIjOTk5OTk5IikgKyBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPXNjb3JlLXNkLCB5bWF4ID0gc2NvcmUrc2QpLCB3aWR0aD0xLCBzaXplPTAuMywgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoKSkgK3lsYWIoIlZBTVAtc2VxIHNjb3JlIikrdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCkpICsgc2NhbGVfeF9kaXNjcmV0ZShicmVha3MgPSBzZXEoMCwgMjQ1LCAxMCkpICsgeGxhYigiZWFjaCBiYXIgaXMgYSBkaWZmZXJlbnQgc2Vjb25kYXJ5IHN0cnVjdHVyZSIpCgojcGxvdCh0cG10X2FhX21lYW4pCmBgYApgYGB7ciBpbmNsdWRlPUZBTFNFfQojIFJlcGVhdCBmb3IgUFRFTgoKcHRlbl9zdW0gPC0gc3VtbWFyeVNFKHB0ZW4xX3Byb2Nfd3QsIG1lYXN1cmV2YXI9InNjb3JlIiwgZ3JvdXB2YXJzPSJwb3NpdGlvbiIpCgpwdGVuX3Bvc19tZWFuIDwtIGdncGxvdChwdGVuX3N1bSwgYWVzKHg9cG9zaXRpb24sIHk9c2NvcmUpKSsgZ2VvbV9iYXIocG9zaXRpb249cG9zaXRpb25fZG9kZ2UoKSwgc3RhdD0iaWRlbnRpdHkiLCBjb2xvdXI9IiM5OTk5OTkiKSArIGdlb21fZXJyb3JiYXIoYWVzKHltaW49c2NvcmUtc2QsIHltYXggPSBzY29yZStzZCksIHdpZHRoPTEsIHNpemU9MC4zLCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgpKSAreWxhYigiVkFNUC1zZXEgc2NvcmUiKSt0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksIGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpKSArIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgNDAzLCAyMCksIGV4cGFuZCA9IGMoMCwwKSkgKyBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApKSArIGdlb21fdmxpbmUoeGludGVyY2VwdD0xODUsIGNvbG9yPSJibGFjayIsIHNpemU9LjEpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTM1MCwgY29sb3I9ImJsYWNrIiwgc2l6ZT0uMSkKcHRlbl9oZWF0IDwtIGdncGxvdChwdGVuMV9wcm9jX3d0LCBhZXMocG9zaXRpb24sIGVuZCkpICsgZ2VvbV90aWxlKGFlcyhmaWxsPXNjb3JlKSkgKyBzY2FsZV9maWxsX2dyYWRpZW50bihjb2xvdXJzID0gYygiIzNGN0NCOSIsICIjRkZFQUYzIiwgIiNCMjFGNEUiKSwgdmFsdWVzID0gc2NhbGVzOjpyZXNjYWxlKGMoLTAuMjMsIDAuNDIsIDEsIDEuMiwgMS40NykpKSsgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCA0MDMsIDIwKSwgZXhwYW5kPWMoMCwwKSkgKyB0aGVtZShsZWdlbmQucG9zaXRpb249J2JvdHRvbScpK3hsYWIoIlBvc2l0aW9uIGluIFRQTVQiKSArIHNjYWxlX3lfZGlzY3JldGUoZXhwYW5kID0gYygwLDApKQojYygtMC43LCAwLjIsIDEsIDEuMywgMi4wMykKI2MoLTAuMjMsIDAuNDIsIDEsIDEuMiwgMS40NykKCiNsb2NhbAojc291cmNlID0gaHR0cHM6Ly9naXRodWIuY29tL0Zvd2xlckxhYi9WQU1Qc2VxLCBQVEVOX3Bvc2l0aW9uYWxfZGF0YS50c3YKI2NvdWxkIGhhdmUgZG9uZSBpdCB0aGUgc2FtZSB3YXkgYXMgdHBtdCwgYnV0IHJlc3VsdGluZyBncmFwaCBoYXMgYSBsaXR0bGUgcXVpcmsgCnB0ZW5fZXh0cmEgPC0gcmVhZC50YWJsZShmaWxlID0gJ34vbGVrbGFiL2xla2xhYi9QVEVOX3Bvc2l0aW9uYWxfZGF0YS50c3YnLCBzZXAgPSAnXHQnLCBoZWFkZXIgPSBUUlVFKQpwdGVuX2Rzc3Bfc2NoZW1hdGljIDwtIGdncGxvdCgpICsgZ2d0aXRsZSgiUFRFTiBtZWFuIGFidW5kYW5jZSBzY29yZXMiKSArCiAgZ2VvbV9zZWdtZW50KGFlcyh4ID0gMSwgeSA9IDAsIHhlbmQgPSBtYXgocHRlbl9leHRyYSRwb3NpdGlvbikpLCB5ZW5kID0gMCwgc2l6ZSA9IDEsIGNvbG9yID0gImdyZXk3MCIpICsKICBnZW9tX3BvaW50KGRhdGEgPSBzdWJzZXQocHRlbl9leHRyYSwgIWlzLm5hKHhjYSkpLCBhZXMoeCA9IHBvc2l0aW9uLCB5ID0gMCksIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEuOCkgKwogIGdlb21fcG9pbnQoZGF0YSA9IHN1YnNldChwdGVuX2V4dHJhLCBzaGVldCA9PSAxKSwgYWVzKHggPSBwb3NpdGlvbiwgeSA9IDApLCBjb2xvciA9ICJwaW5rIiwgc2l6ZSA9IDEuNSkgKwogIGdlb21fcG9pbnQoZGF0YSA9IHN1YnNldChwdGVuX2V4dHJhLCBoZWxpeCA9PSAxKSwgYWVzKHggPSBwb3NpdGlvbiwgeSA9IDApLCBjb2xvciA9ICJjeWFuIiwgc2l6ZSA9IDEuNSkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgNDAzLCAyMCksIGV4cGFuZCA9IGMoMCwwKSkgKwogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBOVUxMLCBleHBhbmQgPSBjKDAsMCkpICt4bGFiKE5VTEwpICsgeWxhYihOVUxMKSArCiAgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9ibGFuaygpLCBheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCkpCgojcGxvdHMKcGxvdChwdGVuX3Bvc19tZWFuKQpwbG90KHB0ZW5faGVhdCkKcHRlbl9kc3NwX3NjaGVtYXRpYwoKYGBgCgoKYGBge3J9CiNtZXRob2QxIGZvciB2aXN1YWxpemluZyB0cmFja3MgKGJhc2ljLCBmb3IgdmlzdWFsaXppbmcgaW4gcnN0dWRpbykKZ3JpZC5uZXdwYWdlKCkKZ3JpZC5kcmF3KHJiaW5kKGdncGxvdEdyb2IodHBtdF9kc3NwX3NjaGVtYXRpYyksIGdncGxvdEdyb2IodHBtdF9wb3NfbWVhbiksIGdncGxvdEdyb2IodHBtdF9oZWF0KSwgc2l6ZSA9ICJsYXN0IikpCgpncmlkLm5ld3BhZ2UoKQpncmlkLmRyYXcocmJpbmQoZ2dwbG90R3JvYihwdGVuX2Rzc3Bfc2NoZW1hdGljKSwgZ2dwbG90R3JvYihwdGVuX3Bvc19tZWFuKSwgZ2dwbG90R3JvYihwdGVuX2hlYXQpLCBzaXplID0gImxhc3QiKSkKYGBgCmBgYHtyIGluY2x1ZGU9RkFMU0V9CiNtZXRob2QyICh1c2UgZm9yIGZpbmFsIGxheW91dCwgc2l6ZSBzcGVjaWZpY2F0aW9uLCBkb3dubG9hZCkKZ0E9Z2dwbG90X2d0YWJsZShnZ3Bsb3RfYnVpbGQodHBtdF9wb3NfbWVhbikpCmdCPWdncGxvdF9ndGFibGUoZ2dwbG90X2J1aWxkKHRwbXRfaGVhdCkpCmdDPWdncGxvdF9ndGFibGUoZ2dwbG90X2J1aWxkKHRwbXRfZHNzcF9zY2hlbWF0aWMpKQoKZ2E9Z2dwbG90X2d0YWJsZShnZ3Bsb3RfYnVpbGQocHRlbl9wb3NfbWVhbikpCmdiPWdncGxvdF9ndGFibGUoZ2dwbG90X2J1aWxkKHB0ZW5faGVhdCkpCmdjPWdncGxvdF9ndGFibGUoZ2dwbG90X2J1aWxkKHB0ZW5fZHNzcF9zY2hlbWF0aWMpKQoKbWF4V2lkdGggPSBncmlkOjp1bml0LnBtYXgoZ0Ekd2lkdGhzLCBnQiR3aWR0aHMsIGdDJHdpZHRocywgZ2Ekd2lkdGhzLCBnYiR3aWR0aHMsIGdjJHdpZHRocykKZ0Ekd2lkdGhzIDwtIGFzLmxpc3QobWF4V2lkdGgpCmdCJHdpZHRocyA8LSBhcy5saXN0KG1heFdpZHRoKQpnQyR3aWR0aHMgPC0gYXMubGlzdChtYXhXaWR0aCkKZ2Ekd2lkdGhzIDwtIGFzLmxpc3QobWF4V2lkdGgpCmdiJHdpZHRocyA8LSBhcy5saXN0KG1heFdpZHRoKQpnYyR3aWR0aHMgPC0gYXMubGlzdChtYXhXaWR0aCkKCmdyaWQubmV3cGFnZSgpCgojdG8gZG93bmxvYWQgYXMgcGRmLCB3aXRoIHNwZWNpZmllZCB3aWR0aHMhIQojcGRmKCdwdGVuX3RwbXRfbWVhbl9oZWF0LnBkZicsIHdpZHRoPTgsIGhlaWdodD02KQojZ3JpZC5hcnJhbmdlKGFycmFuZ2VHcm9iKGdDLGdBLGdCLG5yb3c9MyxoZWlnaHRzPWMoLjEsLjMsLjgpKSkKI2dyaWQuYXJyYW5nZShhcnJhbmdlR3JvYihnYyxnYSxnYixucm93PTMsaGVpZ2h0cz1jKC4xLC4zLC44KSkpCiNkZXYub2ZmKCkKYGBgCgpgYGB7cn0KI3Bsb3R0aW5nIG1lYW4gc2NvcmUgZm9yIGVhY2ggdmFyaWFudCBhbWlubyBhY2lkIChncm91cGVkIGJ5IGFtaW5vIGFjaWQgbmFtZSkKdHBtdF9lbmRfc3VtIDwtIHN1bW1hcnlTRSh0cG10MV9wcm9jX3d0LCBtZWFzdXJldmFyPSJzY29yZSIsIGdyb3VwdmFycz0iZW5kIikKdHBtdF9lbmRfbWVhbiA8LSBnZ3Bsb3QodHBtdF9lbmRfc3VtLCBhZXMoeD1lbmQsIHk9c2NvcmUpKSArCiAgZ2VvbV9iYXIocG9zaXRpb249cG9zaXRpb25fZG9kZ2UoKSwgc3RhdD0iaWRlbnRpdHkiLCBjb2xvdXI9IiM5OTk5OTkiKSArCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1zY29yZS1zZCwgeW1heD1zY29yZStzZCksIHdpZHRoPTAuMDAxLCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgpKSArCiAgeWxhYigibWVhbiBhYnVuZGFuY2UiKSArIHhsYWIoInZhcmlhbnQgYW1pbm8gYWNpZCIpICsgdGhlbWVfYncoKQpwbG90KHRwbXRfZW5kX21lYW4pCgojYXMgZXhwZWN0ZWQsIG5vbnNlbnNlIChYKSBoYXMgbG93ZXN0IG1lYW4gYWJ1bmRhbmNlLCBhcyB3ZWxsIGFzIHByb2xpbmUKYGBgCmBgYHtyfQojZG9lcyBub3Qgc2hvdyBtdWNoCgojICMgVmlvbGluIG92ZXJsYWlkIHNjYXR0ZXIgcGxvdHRpbmcgYWxsIGFidW5kYW5jZSBzY29yZXMgdnMgJ2VuZCcgYWEgY29sb3JlZCBieSBsb2NhdGlvbi9zZWNvbmRhcnkgc3RydWN0dXJlCiMgdHBtdF9lbmRfc2NvcmVzX2IgPC0gZ2dwbG90KGRhdGE9c3Vic2V0KHRwbXQxX3Byb2Nfd3QsIHNoZWV0PT0xKSwgYWVzKHg9ZW5kLCB5PXNjb3JlLCBjb2xvdXI9cG9zaXRpb24pKSArCiMgICBnZW9tX3Zpb2xpbihkYXRhPXN1YnNldCh0cG10MV9wcm9jX3d0LCBzaGVldD09MSksIGRyYXdfcXVhbnRpbGVzPTAuNSwgc2NhbGUgPSAid2lkdGgiKSArCiMgICBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KHRwbXQxX3Byb2Nfd3QsIHNoZWV0PT0xKSwgc2l6ZT0uMywgYWxwaGEgPSAwLjYsIHBvc2l0aW9uPWppdHRlcjIpICsgeWxhYigiYWJ1bmRhbmNlIikgKyB4bGFiKCJ2YXJpYW50IGFhIikgKwojICAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLTAuOCwgMi4yKSkKIyAKIyB0cG10X2VuZF9zY29yZXNfYSA8LSBnZ3Bsb3QoZGF0YT1zdWJzZXQodHBtdDFfcHJvY193dCwgaGVsaXg9PTEpLCBhZXMoeD1lbmQsIHk9c2NvcmUsIGNvbG91cj1wb3NpdGlvbikpICsKIyAgIGdlb21fdmlvbGluKGRhdGE9c3Vic2V0KHRwbXQxX3Byb2Nfd3QsIGhlbGl4PT0xKSwgZHJhd19xdWFudGlsZXM9MC41LCBzY2FsZSA9ICJ3aWR0aCIpICsKIyAgIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQodHBtdDFfcHJvY193dCwgaGVsaXg9PTEpLCBzaXplPS4zLCBhbHBoYSA9IDAuNiwgcG9zaXRpb249aml0dGVyMikgKyB5bGFiKCJhYnVuZGFuY2UiKSArIHhsYWIoInZhcmlhbnQgYWEiKSArCiMgICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtMC44LCAyLjIpKQojIAojIHRwbXRfZW5kX3Njb3Jlc19uIDwtIGdncGxvdChkYXRhPXN1YnNldCh0cG10MV9wcm9jX3d0LCBzZWNvbmRhcnlfc3RydWN0PT0ibmVpdGhlciIpLCBhZXMoeD1lbmQsIHk9c2NvcmUsIGNvbG91cj1wb3NpdGlvbikpICsKIyAgIGdlb21fdmlvbGluKGRhdGE9c3Vic2V0KHRwbXQxX3Byb2Nfd3QsIHNlY29uZGFyeV9zdHJ1Y3Q9PSJuZWl0aGVyIiksIGRyYXdfcXVhbnRpbGVzPTAuNSwgc2NhbGUgPSAid2lkdGgiKSArCiMgICBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KHRwbXQxX3Byb2Nfd3QsIHNlY29uZGFyeV9zdHJ1Y3Q9PSJuZWl0aGVyIiksIHNpemU9LjMsIGFscGhhID0gMC42LCBwb3NpdGlvbj1qaXR0ZXIyKSArIHlsYWIoImFidW5kYW5jZSIpICsgeGxhYigidmFyaWFudCBhYSIpICsKIyAgIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKC0wLjgsIDIuMikpCiMgCiMgcGxvdCh0cG10X2VuZF9zY29yZXNfYikKIyBwbG90KHRwbXRfZW5kX3Njb3Jlc19hKQojIHBsb3QodHBtdF9lbmRfc2NvcmVzX24pCgojdHBtdF9lbmRfc2NvcmVzXzYwIDwtIGdncGxvdChkYXRhPXN1YnNldCh0cG10MV9wcm9jX3d0LCBwb3NpdGlvbjw9NjApLCBhZXMoeD1lbmQsIHk9c2NvcmUsIGNvbG91cj1wb3NpdGlvbikpICsKIyAgZ2VvbV92aW9saW4oZGF0YT1zdWJzZXQodHBtdDFfcHJvY193dCwgcG9zaXRpb248PTYwKSwgZHJhd19xdWFudGlsZXM9MC41LCBzY2FsZSA9ICJ3aWR0aCIpICsKIyAgZ2VvbV9wb2ludChkYXRhPXN1YnNldCh0cG10MV9wcm9jX3d0LCBwb3NpdGlvbjw9NjApLCBzaXplPS4zLCBhbHBoYSA9IDAuNiwgcG9zaXRpb249aml0dGVyMikgKyB5bGFiKCJhYnVuZGFuY2UiKSArIHhsYWIoInZhcmlhbnQgYWEiKSArCiMgIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKC0wLjgsIDIuMikpCiN0cG10X2VuZF9zY29yZXNfMTIwIDwtIGdncGxvdChkYXRhPXN1YnNldCh0cG10MV9wcm9jX3d0LCBwb3NpdGlvbj42MCAmIHBvc2l0aW9uPD0xMjApLCBhZXMoeD1lbmQsIHk9c2NvcmUsIGNvbG91cj1wb3NpdGlvbikpICsKIyAgZ2VvbV92aW9saW4oZGF0YT1zdWJzZXQodHBtdDFfcHJvY193dCwgcG9zaXRpb24+NjAgJiBwb3NpdGlvbjw9MTIwKSwgZHJhd19xdWFudGlsZXM9MC41LCBzY2FsZSA9ICJ3aWR0aCIpICsKIyAgZ2VvbV9wb2ludChkYXRhPXN1YnNldCh0cG10MV9wcm9jX3d0LCBwb3NpdGlvbj42MCAmIHBvc2l0aW9uPD0xMjApLCBzaXplPS4zLCBhbHBoYSA9IDAuNiwgcG9zaXRpb249aml0dGVyMikgKyB5bGFiKCJhYnVuZGFuY2UiKSArIHhsYWIoInZhcmlhbnQgYWEiKSArCiMgIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKC0wLjgsIDIuMikpCiN0cG10X2VuZF9zY29yZXNfMTgwIDwtIGdncGxvdChkYXRhPXN1YnNldCh0cG10MV9wcm9jX3d0LCBwb3NpdGlvbj4xMjAgJiBwb3NpdGlvbjw9MTgwKSwgYWVzKHg9ZW5kLCB5PXNjb3JlLCBjb2xvdXI9cG9zaXRpb24pKSArCiMgIGdlb21fdmlvbGluKGRhdGE9c3Vic2V0KHRwbXQxX3Byb2Nfd3QsIHBvc2l0aW9uPjEyMCAmIHBvc2l0aW9uPD0xODApLCBkcmF3X3F1YW50aWxlcz0wLjUsIHNjYWxlID0gIndpZHRoIikgKwojICBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KHRwbXQxX3Byb2Nfd3QsIHBvc2l0aW9uPjEyMCAmIHBvc2l0aW9uPD0xODApLCBzaXplPS4zLCBhbHBoYSA9IDAuNiwgcG9zaXRpb249aml0dGVyMikgKyB5bGFiKCJhYnVuZGFuY2UiKSArIHhsYWIoInZhcmlhbnQgYWEiKSArCiMgIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKC0wLjgsIDIuMikpCiN0cG10X2VuZF9zY29yZXNfMjQ1IDwtIGdncGxvdChkYXRhPXN1YnNldCh0cG10MV9wcm9jX3d0LCBwb3NpdGlvbj4xODAgJiBwb3NpdGlvbjw9MjQ1KSwgYWVzKHg9ZW5kLCB5PXNjb3JlLCBjb2xvdXI9cG9zaXRpb24pKSArCiMgIGdlb21fdmlvbGluKGRhdGE9c3Vic2V0KHRwbXQxX3Byb2Nfd3QsIHBvc2l0aW9uPjE4MCAmIHBvc2l0aW9uPD0yNDUpLCBkcmF3X3F1YW50aWxlcz0wLjUsIHNjYWxlID0gIndpZHRoIikgKwojICBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KHRwbXQxX3Byb2Nfd3QsIHBvc2l0aW9uPjE4MCAmIHBvc2l0aW9uPD0yNDUpLCBzaXplPS4zLCBhbHBoYSA9IDAuNiwgcG9zaXRpb249aml0dGVyMikgKyB5bGFiKCJhYnVuZGFuY2UiKSArIHhsYWIoInZhcmlhbnQgYWEiKSArCiMgIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKC0wLjgsIDIuMikpCgojcGxvdCh0cG10X2VuZF9zY29yZXNfNjApCiNwbG90KHRwbXRfZW5kX3Njb3Jlc18xMjApCiNwbG90KHRwbXRfZW5kX3Njb3Jlc18xODApCiNwbG90KHRwbXRfZW5kX3Njb3Jlc18yNDUpCmBgYAoKCmBgYHtyIGVjaG89RkFMU0V9CiMgRm9jdXNpbmcgb24gaW5kaXZpZHVhbCAic3RhcnQiLCBvciByZWZlcmVuY2UsIGFtaW5vIGFjaWRzIQpzZXQuc2VlZCgxNTMpCmppdHRlciA8LSBwb3NpdGlvbl9qaXR0ZXIod2lkdGggPSAxLCBoZWlnaHQgPSBOVUxMKQpqaXR0ZXIxIDwtcG9zaXRpb25faml0dGVyKHdpZHRoID0gMC4wOCwgaGVpZ2h0ID0gTlVMTCkKaml0dGVyMiA8LSBwb3NpdGlvbl9qaXR0ZXIod2lkdGg9MC4xMywgaGVpZ2h0ID0gTlVMTCkKdHdlbnR5X2NvbG9yID0gYygiI0QwMjAyOCIsICIjRTFBMTJGIiwgIiNFREQ5NDEiLCAiI0YyRjA4RSIsICIjRUVDODk4IiwgIiNCQ0REQUUiLCAiI0E0QzMzQiIsICIjNzZDMTU4IiwgIiM4NTc4MkUiLCAiIzMxNTkzNSIsICIjNTM5NThCIiwgIiNBMURBRTAiLCAiIzQ4NkVCNiIsICIjRTZBM0I0IiwgIiNDNUEwQ0EiLCAiIzU1NERBMCIsICIjOTkyNDdFIiwgIiM0MDIwNTkiLCAiIzgyNDIxQiIsICIjN0U4MDdFIiwgJ2JsYWNrJykKCiNwdGVuX2tfc3ByZWFkMSA8LSBnZ3Bsb3QocHRlbjFfcHJvY193dCwgYWVzKHk9c2NvcmUsIHg9c3RhcnQpKSArIGdlb21fdmlvbGluKGRyYXdfcXVhbnRpbGVzPWMoMC41KSwgZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiSyIpLCBhZXMoZ3JvdXA9ZmFjdG9yKHBvc2l0aW9uKSkpICsgeGxhYigiUG9zaXRpb24gaW4gUFRFTiIpICsgZ2d0aXRsZSgiTHlzaW5lIHZhcmlhbnQgYWJ1bmRhbmNlIHNjb3JlcyIpCgojIFZpb2xpbiBvdmVybGFpZCBzY2F0dGVyIG9mIGVhY2ggcmVmZXJlbmNlIGx5c2luZSdzIHZhcmlhbnQgc2NvcmVzIHZzIHBvc2l0aW9uIGluIHByb3RlaW4KcHRlbl9rX3NwcmVhZDEgPC0gZ2dwbG90KHB0ZW4xX3Byb2Nfd3QsIGFlcyh5PXNjb3JlLCB4PWZhY3Rvcihwb3NpdGlvbiksIGNvbG91ciA9IGVuZCkpICsgZ2VvbV92aW9saW4oZHJhd19xdWFudGlsZXM9YygwLjUpLCBkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJLIiksIGFlcyhncm91cD1mYWN0b3IocG9zaXRpb24pKSwgc2NhbGUgPSAid2lkdGgiKSArIHhsYWIoIlBvc2l0aW9uIGluIFBURU4iKSArIGdndGl0bGUoIkx5c2luZSB2YXJpYW50IGFidW5kYW5jZSBzY29yZXMiKSsgZ2VvbV9wb2ludChkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJLIiksIGFlcyh4PWZhY3Rvcihwb3NpdGlvbiksIHk9c2NvcmUpLCBhbHBoYSA9IDAuODUsIHBvc2l0aW9uPWppdHRlcjIpICsgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz10d2VudHlfY29sb3IpICsgdGhlbWVfYncoKQoKIyBWaW9saW4gb3ZlcmxhaWQgc2NhdHRlciBvZiBlYWNoIHJlZmVyZW5jZSBseXNpbmUncyB2YXJpYW50IHNjb3JlcyBncm91cGVkIGJ5IGFtaW5vIGFjaWQKcHRlbl9rX2FhIDwtIGdncGxvdChwdGVuMV9wcm9jX3d0LCBhZXMoeT1zY29yZSwgeD1lbmQsIGNvbG91ciA9IGVuZCkpICsgZ2VvbV92aW9saW4oZHJhd19xdWFudGlsZXM9YygwLjUpLCBkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJLIiksIGFlcyhncm91cD1lbmQpLCBzY2FsZSA9ICJ3aWR0aCIpICsgeGxhYigiQW1pbm8gYWNpZCIpICsgZ2d0aXRsZSgiTHlzaW5lIHZhcmlhbnQgYWJ1bmRhbmNlIHNjb3JlcyIpKyBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHN0YXJ0PT0gIksiKSwgYWVzKHg9ZW5kLCB5PXNjb3JlKSwgYWxwaGEgPSAwLjc1LCBwb3NpdGlvbj1qaXR0ZXIxKSArIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9dHdlbnR5X2NvbG9yKSArIHRoZW1lX2J3KCkKCiMgUmVwZWF0IGZvciBnbHljaW5lIGFuZCBjeXN0ZWluZSBhbmQgLi4uCnB0ZW5fZ19zcHJlYWQxIDwtIGdncGxvdChwdGVuMV9wcm9jX3d0LCBhZXMoeT1zY29yZSwgeD1mYWN0b3IocG9zaXRpb24pLCBjb2xvdXIgPSBlbmQpKSArIGdlb21fdmlvbGluKGRyYXdfcXVhbnRpbGVzPWMoMC41KSwgZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiRyIpLCBhZXMoZ3JvdXA9ZmFjdG9yKHBvc2l0aW9uKSksIHNjYWxlID0gIndpZHRoIikgKyB4bGFiKCJQb3NpdGlvbiBpbiBQVEVOIikgKyBnZ3RpdGxlKCJHbHljaW5lIHZhcmlhbnQgYWJ1bmRhbmNlIHNjb3JlcyIpKyBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHN0YXJ0PT0gIkciKSwgYWVzKHg9ZmFjdG9yKHBvc2l0aW9uKSwgeT1zY29yZSksIGFscGhhID0gMC44NSwgcG9zaXRpb249aml0dGVyMikgKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPXR3ZW50eV9jb2xvcikgKyB0aGVtZV9idygpCgpwdGVuX2dfYWEgPC0gZ2dwbG90KHB0ZW4xX3Byb2Nfd3QsIGFlcyh5PXNjb3JlLCB4PWVuZCwgY29sb3VyID0gZW5kKSkgKyBnZW9tX3Zpb2xpbihkcmF3X3F1YW50aWxlcz1jKDAuNSksIGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHN0YXJ0PT0gIkciKSwgYWVzKGdyb3VwPWVuZCksIHNjYWxlID0gIndpZHRoIikgKyB4bGFiKCJBbWlubyBhY2lkIikgKyBnZ3RpdGxlKCJHbHljaW5lIHZhcmlhbnQgYWJ1bmRhbmNlIHNjb3JlcyIpKyBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHN0YXJ0PT0gIkciKSwgYWVzKHg9ZW5kLCB5PXNjb3JlKSwgYWxwaGEgPSAwLjc1LCBwb3NpdGlvbj1qaXR0ZXIxKSArIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9dHdlbnR5X2NvbG9yKSArIHRoZW1lX2J3KCkKCiMgU2FtZSBhcyBwdGVuX1thYV1fc3ByZWFkMSwganVzdCBjb2xvcmVkIGJ5IGRpZmZlcmVuY2UgaW4gaHlkcm9waG9iaWNpdHkgaW5zdGVhZCBvZiB2YXJpYW50IGFhCnB0ZW5fZ19oeWRyb2RpZmYgPC0gZ2dwbG90KHB0ZW4xX3Byb2Nfd3QsIGFlcyh5PXNjb3JlLCB4PWZhY3Rvcihwb3NpdGlvbiksIGNvbG91ciA9IChoeWRybzItaHlkcm8xKSkpICsgZ2VvbV92aW9saW4oZHJhd19xdWFudGlsZXM9YygwLjUpLCBkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJHIiksIGFlcyhncm91cD1mYWN0b3IocG9zaXRpb24pKSwgc2NhbGUgPSAid2lkdGgiKSArIHhsYWIoIlBvc2l0aW9uIGluIFBURU4iKSArIGdndGl0bGUoIkdseWNpbmUgdmFyaWFudCBhYnVuZGFuY2Ugc2NvcmVzIHcvIGh5ZHJvcGhvYmljaXR5IGNoYW5nZSIpKyBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHN0YXJ0PT0gIkciKSwgYWVzKHg9ZmFjdG9yKHBvc2l0aW9uKSwgeT1zY29yZSksIGFscGhhID0gMC44NSwgcG9zaXRpb249aml0dGVyMikgKyBzY2FsZV9jb2xvcl9kaXN0aWxsZXIocGFsZXR0ZSA9ICJTcGVjdHJhbCIpICsgdGhlbWVfYncoKQoKIyBKdXN0IGJhc2ljIHNjYXR0ZXIgcGxvdCB2ZXJzaW9uIG9mIHB0ZW5fY19zcHJlYWQxCnB0ZW5fY19zcHJlYWQgPC0gZ2dwbG90KHB0ZW4xX3Byb2Nfd3QsIGFlcyh5PXNjb3JlLCB4PXBvc2l0aW9uKSkgKyBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHN0YXJ0PT0gIkMiKSkgKyB4bGFiKCJQb3NpdGlvbiBpbiBQVEVOIikgKyBnZ3RpdGxlKCJDeXN0ZWluZSB2YXJpYW50IGFidW5kYW5jZSBzY29yZXMiKSArIHRoZW1lX2J3KCkKCnB0ZW5fY19zcHJlYWQxIDwtIGdncGxvdChwdGVuMV9wcm9jX3d0LCBhZXMoeT1zY29yZSwgeD1wb3NpdGlvbiwgY29sb3VyID0gZW5kKSkgKyBnZW9tX3Zpb2xpbihkcmF3X3F1YW50aWxlcz1jKDAuNSksIGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHN0YXJ0PT0gIkMiKSwgYWVzKGdyb3VwPXBvc2l0aW9uJSU0NTApLCBzY2FsZSA9ICJ3aWR0aCIpICsgeGxhYigiUG9zaXRpb24gaW4gUFRFTiIpICsgZ2d0aXRsZSgiQ3lzdGVpbmUgdmFyaWFudCBhYnVuZGFuY2Ugc2NvcmVzIikrIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiQyIpLCBhZXMoeD1wb3NpdGlvbiwgeT1zY29yZSksIGFscGhhID0gMC43NSwgcG9zaXRpb249aml0dGVyMSkgKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPXR3ZW50eV9jb2xvcikgKyB0aGVtZV9idygpCgpwdGVuX2NfYWEgPC0gZ2dwbG90KHB0ZW4xX3Byb2Nfd3QsIGFlcyh5PXNjb3JlLCB4PWVuZCwgY29sb3VyID0gZW5kKSkgKyBnZW9tX3Zpb2xpbihkcmF3X3F1YW50aWxlcz1jKDAuNSksIGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHN0YXJ0PT0gIkMiKSwgYWVzKGdyb3VwPWVuZCksIHNjYWxlID0gIndpZHRoIikgKyB4bGFiKCJBbWlubyBhY2lkIikgKyBnZ3RpdGxlKCJDeXN0ZWluZSB2YXJpYW50IGFidW5kYW5jZSBzY29yZXMiKSsgZ2VvbV9wb2ludChkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJDIiksIGFlcyh4PWVuZCwgeT1zY29yZSksIGFscGhhID0gMC43NSwgcG9zaXRpb249aml0dGVyMSkgKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPXR3ZW50eV9jb2xvcikgKyB0aGVtZV9idygpCgpwdGVuX2NfaHlkcm9kaWZmIDwtIGdncGxvdChwdGVuMV9wcm9jX3d0LCBhZXMoeT1zY29yZSwgeD1wb3NpdGlvbiwgY29sb3VyID0gKGh5ZHJvMi1oeWRybzEpKSkgKyBnZW9tX3Zpb2xpbihkcmF3X3F1YW50aWxlcz1jKDAuNSksIGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHN0YXJ0PT0gIkMiKSwgYWVzKGdyb3VwPXBvc2l0aW9uJSU0NTApLCBzY2FsZSA9ICJ3aWR0aCIpICsgeGxhYigiUG9zaXRpb24gaW4gUFRFTiIpICsgZ2d0aXRsZSgiQ3lzdGVpbmUgdmFyaWFudCBhYnVuZGFuY2Ugc2NvcmVzIHcvIGh5ZHJvcGhvYmljaXR5IGNoYW5nZSIpKyBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHN0YXJ0PT0gIkMiKSwgYWVzKHg9cG9zaXRpb24sIHk9c2NvcmUpLCBhbHBoYSA9IDAuNzUsIHBvc2l0aW9uPWppdHRlcjEpICsgc2NhbGVfY29sb3JfZGlzdGlsbGVyKHBhbGV0dGUgPSAiU3BlY3RyYWwiKSArIHRoZW1lX2J3KCkKCgojcHRlbl9zX3NwcmVhZCA8LSBnZ3Bsb3QocHRlbjFfcHJvY193dCwgYWVzKHk9c2NvcmUsIHg9cG9zaXRpb24pKSArIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiUyIpKSArIHhsYWIoIlBvc2l0aW9uIGluIFBURU4iKSArIGdndGl0bGUoIlNlcmluZSB2YXJpYW50IGFidW5kYW5jZSBzY29yZXMiKQojcHRlbl9zX3NwcmVhZDFfb2xkIDwtIGdncGxvdChwdGVuMV9wcm9jX3d0LCBhZXMoeT1zY29yZSwgeD1zdGFydCkpICsgZ2VvbV92aW9saW4oZHJhd19xdWFudGlsZXM9YygwLjUpLCBkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJTIiksIGFlcyhncm91cD1mYWN0b3IocG9zaXRpb24pKSkgKyB4bGFiKCJQb3NpdGlvbiBpbiBQVEVOIikgKyBnZ3RpdGxlKCJTZXJpbmUgdmFyaWFudCBhYnVuZGFuY2Ugc2NvcmVzIikKCnB0ZW5fc19zcHJlYWQxIDwtIGdncGxvdChwdGVuMV9wcm9jX3d0LCBhZXMoeT1zY29yZSwgeD1mYWN0b3IocG9zaXRpb24pLCBjb2xvdXIgPSBlbmQpKSArIGdlb21fdmlvbGluKGRyYXdfcXVhbnRpbGVzPWMoMC41KSwgZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiUyIpLCBhZXMoZ3JvdXA9ZmFjdG9yKHBvc2l0aW9uKSksIHNjYWxlID0gIndpZHRoIikgKyB4bGFiKCJQb3NpdGlvbiBpbiBQVEVOIikgKyBnZ3RpdGxlKCJTZXJpbmUgdmFyaWFudCBhYnVuZGFuY2Ugc2NvcmVzIikrIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiUyIpLCBhZXMoeD1mYWN0b3IocG9zaXRpb24pLCB5PXNjb3JlKSwgYWxwaGEgPSAwLjg1LCBwb3NpdGlvbj1qaXR0ZXIyKSArIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9dHdlbnR5X2NvbG9yKSArIHRoZW1lX2J3KCkKCnB0ZW5fc19hYSA8LSBnZ3Bsb3QocHRlbjFfcHJvY193dCwgYWVzKHk9c2NvcmUsIHg9ZW5kLCBjb2xvdXIgPSBlbmQpKSArIGdlb21fdmlvbGluKGRyYXdfcXVhbnRpbGVzPWMoMC41KSwgZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiUyIpLCBhZXMoZ3JvdXA9ZW5kKSwgc2NhbGUgPSAid2lkdGgiKSArIHhsYWIoIkFtaW5vIGFjaWQiKSArIGdndGl0bGUoIlNlcmluZSB2YXJpYW50IGFidW5kYW5jZSBzY29yZXMiKSsgZ2VvbV9wb2ludChkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJTIiksIGFlcyh4PWVuZCwgeT1zY29yZSksIGFscGhhID0gMC43NSwgcG9zaXRpb249aml0dGVyMSkgKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPXR3ZW50eV9jb2xvcikgKyB0aGVtZV9idygpCgpwdGVuX3NfaHlkcm9kaWZmIDwtIGdncGxvdChwdGVuMV9wcm9jX3d0LCBhZXMoeT1zY29yZSwgeD1mYWN0b3IocG9zaXRpb24pLCBjb2xvdXIgPSAoaHlkcm8yLWh5ZHJvMSkpKSArIGdlb21fdmlvbGluKGRyYXdfcXVhbnRpbGVzPWMoMC41KSwgZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiUyIpLCBhZXMoZ3JvdXA9ZmFjdG9yKHBvc2l0aW9uKSksIHNjYWxlID0gIndpZHRoIikgKyB4bGFiKCJQb3NpdGlvbiBpbiBQVEVOIikgKyBnZ3RpdGxlKCJTZXJpbmUgdmFyaWFudCBhYnVuZGFuY2Ugc2NvcmVzIHcvIGh5ZHJvcGhvYmljaXR5IGNoYW5nZSIpKyBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHN0YXJ0PT0gIlMiKSwgYWVzKHg9ZmFjdG9yKHBvc2l0aW9uKSwgeT1zY29yZSksIGFscGhhID0gMC44NSwgcG9zaXRpb249aml0dGVyMikgKyBzY2FsZV9jb2xvcl9kaXN0aWxsZXIocGFsZXR0ZSA9ICJTcGVjdHJhbCIpICsgdGhlbWVfYncoKQoKIyBHcmFwaGluZyBhYnVuZGFuY2Ugc2NvcmUgKHktYXhpcykgdnMgY2hhbmdlIGluIGh5ZHJvcGhvYmljaXR5ICh4LWF4aXMpCnB0ZW5fc19oaF9oeWRyb2RpZmYgPC0gZ2dwbG90KHB0ZW4xX3Byb2Nfd3QsIGFlcyh5PXNjb3JlLCB4PWZhY3RvcihoeWRybzItaHlkcm8xKSwgY29sb3VyID0gKGh5ZHJvMi1oeWRybzEpKSkgKyBnZW9tX3Zpb2xpbihkcmF3X3F1YW50aWxlcz1jKDAuNSksIGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHN0YXJ0PT0gIlMiKSwgYWVzKGdyb3VwPWZhY3RvcihoeWRybzItaHlkcm8xKSksIHNjYWxlID0gIndpZHRoIikgKyB4bGFiKCJDaGFuZ2UgaW4gaHlkcm9waG9iaWNpdHkiKSArIGdndGl0bGUoIlNlcmluZSB2YXJpYW50IGFidW5kYW5jZSBzY29yZXMiKSsgZ2VvbV9wb2ludChkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJTIiksIGFlcyh4PWZhY3RvcihoeWRybzItaHlkcm8xKSwgeT1zY29yZSksIGFscGhhID0gMC43NSwgcG9zaXRpb249aml0dGVyMSkgKyB0aGVtZV9idygpCgojIyBHcmFwaGVkIGRhdGEgaXMgZXhhY3RseSB0aGUgc2FtZSBhcyBwdGVuX3NfYWEsIGJ1dCBjb2xvcnMgYnkgY2hhbmdlIGluIGh5ZHJvcGhvYmljaXR5IHJhdGhlciB0aGFuIHZhcmlhbnQKI3B0ZW5fc19hYV9oeWRyb2RpZmYgPC0gZ2dwbG90KHB0ZW4xX3Byb2Nfd3QsIGFlcyh5PXNjb3JlLCB4PWVuZCwgY29sb3VyID0gKGh5ZHJvMi1oeWRybzEpKSkgKyBnZW9tX3Zpb2xpbihkcmF3X3F1YW50aWxlcz1jKDAuNSksIGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHN0YXJ0PT0gIlMiKSwgYWVzKGdyb3VwPWVuZCksIHNjYWxlID0gIndpZHRoIikgKyB4bGFiKCJBbWlubyBhY2lkIikgKyBnZ3RpdGxlKCJTZXJpbmUgdmFyaWFudCBhYnVuZGFuY2Ugc2NvcmVzIikrIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiUyIpLCBhZXMoeD1lbmQsIHk9c2NvcmUpLCBhbHBoYSA9IDAuNzUsIHBvc2l0aW9uPWppdHRlcjEpCgojIERpZmZlcmVudCB2YXJpYXRpb25zCiNwdGVuX3NfYWFfdm9sZGlmZiA8LSBnZ3Bsb3QocHRlbjFfcHJvY193dCwgYWVzKHk9c2NvcmUsIHg9ZW5kLCBjb2xvdXIgPSB2b2xkaWZmKSkgKyBnZW9tX3Zpb2xpbihkcmF3X3F1YW50aWxlcz1jKDAuNSksIGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHN0YXJ0PT0gIlMiKSwgYWVzKGdyb3VwPWVuZCksIHNjYWxlID0gIndpZHRoIikgKyB4bGFiKCJBbWlubyBhY2lkIikgKyBnZ3RpdGxlKCJTZXJpbmUgdmFyaWFudCBhYnVuZGFuY2Ugc2NvcmVzIikrIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiUyIpLCBhZXMoeD1lbmQsIHk9c2NvcmUpLCBhbHBoYSA9IDAuNzUsIHBvc2l0aW9uPWppdHRlcjEpCiNwdGVuX3NfYWFfcG9sZGlmZiA8LSBnZ3Bsb3QocHRlbjFfcHJvY193dCwgYWVzKHk9c2NvcmUsIHg9ZW5kLCBjb2xvdXIgPSBwb2xhcml0eWRpZmYpKSArIGdlb21fdmlvbGluKGRyYXdfcXVhbnRpbGVzPWMoMC41KSwgZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiUyIpLCBhZXMoZ3JvdXA9ZW5kKSwgc2NhbGUgPSAid2lkdGgiKSArIHhsYWIoIkFtaW5vIGFjaWQiKSArIGdndGl0bGUoIlNlcmluZSB2YXJpYW50IGFidW5kYW5jZSBzY29yZXMiKSsgZ2VvbV9wb2ludChkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJTIiksIGFlcyh4PWVuZCwgeT1zY29yZSksIGFscGhhID0gMC43NSwgcG9zaXRpb249aml0dGVyMSkKI3B0ZW5fc19hYV93ZWlnaHRkaWZmIDwtIGdncGxvdChwdGVuMV9wcm9jX3d0LCBhZXMoeT1zY29yZSwgeD1lbmQsIGNvbG91ciA9IHdlaWdodGRpZmYpKSArIGdlb21fdmlvbGluKGRyYXdfcXVhbnRpbGVzPWMoMC41KSwgZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiUyIpLCBhZXMoZ3JvdXA9ZW5kKSwgc2NhbGUgPSAid2lkdGgiKSArIHhsYWIoIkFtaW5vIGFjaWQiKSArIGdndGl0bGUoIlNlcmluZSB2YXJpYW50IGFidW5kYW5jZSBzY29yZXMiKSsgZ2VvbV9wb2ludChkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJTIiksIGFlcyh4PWVuZCwgeT1zY29yZSksIGFscGhhID0gMC43NSwgcG9zaXRpb249aml0dGVyMSkKCiNzcGVjaWZpYyBhbWlubyBhY2lkIHRlc3RzCiMjcGxvdChwdGVuX2tfc3ByZWFkKQojI3Bsb3QocHRlbl9nX3NwcmVhZCkKIyNwbG90KHB0ZW5fY19zcHJlYWQpCgojI3Bsb3QocHRlbl9zX3NwcmVhZCkKIyNwbG90KHB0ZW5fc19zcHJlYWQxX29sZCkKCiNwbG90KHB0ZW5fc19oaF9oeWRyb2RpZmYpICNwcm9iYWJseSBub3QgdmVyeSB1c2VmdWwuLi4gZG9lcyBub3QgdGFrZSBpbnRvIGFjY291bnQgcG9zaXRpb24gYW55bW9yZQojcGxvdChwdGVuX3NfYWFfaHlkcm9kaWZmKSAjbm90IGFzIHVzZWZ1bCBhcyBwdGVuX3NfYWEKIyNwbG90KHB0ZW5fc19hYV92b2xkaWZmKQojI3Bsb3QocHRlbl9zX2FhX3BvbGRpZmYpCiMjcGxvdChwdGVuX3NfYWFfd2VpZ2h0ZGlmZikKCnBsb3QocHRlbl9jX3NwcmVhZDEpCnBsb3QocHRlbl9jX2FhKQpwbG90KHB0ZW5fY19oeWRyb2RpZmYpCnBsb3QocHRlbl9zX3NwcmVhZDEpCnBsb3QocHRlbl9zX2FhKQpwbG90KHB0ZW5fc19oeWRyb2RpZmYpCnBsb3QocHRlbl9nX3NwcmVhZDEpCnBsb3QocHRlbl9nX2FhKQpwbG90KHB0ZW5fZ19oeWRyb2RpZmYpCnBsb3QocHRlbl9rX3NwcmVhZDEpCnBsb3QocHRlbl9rX2FhKQoKYGBgCgpgYGB7cn0KIyBNb3JlIG9mIGFib3ZlCnB0ZW5fYV9zcHJlYWQxIDwtIGdncGxvdChwdGVuMV9wcm9jX3d0LCBhZXMoeT1zY29yZSwgeD1mYWN0b3IocG9zaXRpb24pLCBjb2xvdXIgPSBlbmQpKSArIGdlb21fdmlvbGluKGRyYXdfcXVhbnRpbGVzPWMoMC41KSwgZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiQSIpLCBhZXMoZ3JvdXA9ZmFjdG9yKHBvc2l0aW9uKSksIHNjYWxlID0gIndpZHRoIikgKyB4bGFiKCJQb3NpdGlvbiBpbiBQVEVOIikgKyBnZ3RpdGxlKCJBbGFuaW5lIHZhcmlhbnQgYWJ1bmRhbmNlIHNjb3JlcyIpKyBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHN0YXJ0PT0gIkEiKSwgYWVzKHg9ZmFjdG9yKHBvc2l0aW9uKSwgeT1zY29yZSksIGFscGhhID0gMC44NSwgcG9zaXRpb249aml0dGVyMikgKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPXR3ZW50eV9jb2xvcikgKyB0aGVtZV9idygpCgpwdGVuX2FfYWEgPC0gZ2dwbG90KHB0ZW4xX3Byb2Nfd3QsIGFlcyh5PXNjb3JlLCB4PWVuZCwgY29sb3VyID0gZW5kKSkgKyBnZW9tX3Zpb2xpbihkcmF3X3F1YW50aWxlcz1jKDAuNSksIGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHN0YXJ0PT0gIkEiKSwgYWVzKGdyb3VwPWVuZCksIHNjYWxlID0gIndpZHRoIikgKyB4bGFiKCJBbWlubyBhY2lkIikgKyBnZ3RpdGxlKCJBbGFuaW5lIHZhcmlhbnQgYWJ1bmRhbmNlIHNjb3JlcyIpKyBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHN0YXJ0PT0gIkEiKSwgYWVzKHg9ZW5kLCB5PXNjb3JlKSwgYWxwaGEgPSAwLjc1LCBwb3NpdGlvbj1qaXR0ZXIxKSArIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9dHdlbnR5X2NvbG9yKSArIHRoZW1lX2J3KCkKCnB0ZW5fcl9zcHJlYWQxIDwtIGdncGxvdChwdGVuMV9wcm9jX3d0LCBhZXMoeT1zY29yZSwgeD1mYWN0b3IocG9zaXRpb24pLCBjb2xvdXIgPSBlbmQpKSArIGdlb21fdmlvbGluKGRyYXdfcXVhbnRpbGVzPWMoMC41KSwgZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiUiIpLCBhZXMoZ3JvdXA9ZmFjdG9yKHBvc2l0aW9uKSksIHNjYWxlID0gIndpZHRoIikgKyB4bGFiKCJQb3NpdGlvbiBpbiBQVEVOIikgKyBnZ3RpdGxlKCJBcmdhbmluZSB2YXJpYW50IGFidW5kYW5jZSBzY29yZXMiKSsgZ2VvbV9wb2ludChkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJSIiksIGFlcyh4PWZhY3Rvcihwb3NpdGlvbiksIHk9c2NvcmUpLCBhbHBoYSA9IDAuODUsIHBvc2l0aW9uPWppdHRlcjIpICsgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz10d2VudHlfY29sb3IpICsgdGhlbWVfYncoKQoKcHRlbl9yX2FhIDwtIGdncGxvdChwdGVuMV9wcm9jX3d0LCBhZXMoeT1zY29yZSwgeD1lbmQsIGNvbG91ciA9IGVuZCkpICsgZ2VvbV92aW9saW4oZHJhd19xdWFudGlsZXM9YygwLjUpLCBkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJSIiksIGFlcyhncm91cD1lbmQpLCBzY2FsZSA9ICJ3aWR0aCIpICsgeGxhYigiQW1pbm8gYWNpZCIpICsgZ2d0aXRsZSgiQXJnYW5pbmUgdmFyaWFudCBhYnVuZGFuY2Ugc2NvcmVzIikrIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiUiIpLCBhZXMoeD1lbmQsIHk9c2NvcmUpLCBhbHBoYSA9IDAuNzUsIHBvc2l0aW9uPWppdHRlcjEpICsgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz10d2VudHlfY29sb3IpICsgdGhlbWVfYncoKQoKcHRlbl9uX3NwcmVhZDEgPC0gZ2dwbG90KHB0ZW4xX3Byb2Nfd3QsIGFlcyh5PXNjb3JlLCB4PWZhY3Rvcihwb3NpdGlvbiksIGNvbG91ciA9IGVuZCkpICsgZ2VvbV92aW9saW4oZHJhd19xdWFudGlsZXM9YygwLjUpLCBkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJOIiksIGFlcyhncm91cD1mYWN0b3IocG9zaXRpb24pKSwgc2NhbGUgPSAid2lkdGgiKSArIHhsYWIoIlBvc2l0aW9uIGluIFBURU4iKSArIGdndGl0bGUoIkFzcGFyYWdpbmUgdmFyaWFudCBhYnVuZGFuY2Ugc2NvcmVzIikrIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiTiIpLCBhZXMoeD1mYWN0b3IocG9zaXRpb24pLCB5PXNjb3JlKSwgYWxwaGEgPSAwLjg1LCBwb3NpdGlvbj1qaXR0ZXIyKSArIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9dHdlbnR5X2NvbG9yKSArIHRoZW1lX2J3KCkKCnB0ZW5fbl9hYSA8LSBnZ3Bsb3QocHRlbjFfcHJvY193dCwgYWVzKHk9c2NvcmUsIHg9ZW5kLCBjb2xvdXIgPSBlbmQpKSArIGdlb21fdmlvbGluKGRyYXdfcXVhbnRpbGVzPWMoMC41KSwgZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiTiIpLCBhZXMoZ3JvdXA9ZW5kKSwgc2NhbGUgPSAid2lkdGgiKSArIHhsYWIoIkFtaW5vIGFjaWQiKSArIGdndGl0bGUoIkFzcGFyYWdpbmUgdmFyaWFudCBhYnVuZGFuY2Ugc2NvcmVzIikrIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiTiIpLCBhZXMoeD1lbmQsIHk9c2NvcmUpLCBhbHBoYSA9IDAuNzUsIHBvc2l0aW9uPWppdHRlcjEpICsgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz10d2VudHlfY29sb3IpICsgdGhlbWVfYncoKQoKcHRlbl9kX3NwcmVhZDEgPC0gZ2dwbG90KHB0ZW4xX3Byb2Nfd3QsIGFlcyh5PXNjb3JlLCB4PWZhY3Rvcihwb3NpdGlvbiksIGNvbG91ciA9IGVuZCkpICsgZ2VvbV92aW9saW4oZHJhd19xdWFudGlsZXM9YygwLjUpLCBkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJEIiksIGFlcyhncm91cD1mYWN0b3IocG9zaXRpb24pKSwgc2NhbGUgPSAid2lkdGgiKSArIHhsYWIoIlBvc2l0aW9uIGluIFBURU4iKSArIGdndGl0bGUoIkFzcGFydGljIEFjaWQgdmFyaWFudCBhYnVuZGFuY2Ugc2NvcmVzIikrIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiRCIpLCBhZXMoeD1mYWN0b3IocG9zaXRpb24pLCB5PXNjb3JlKSwgYWxwaGEgPSAwLjg1LCBwb3NpdGlvbj1qaXR0ZXIyKSArIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9dHdlbnR5X2NvbG9yKSArIHRoZW1lX2J3KCkKCnB0ZW5fZF9hYSA8LSBnZ3Bsb3QocHRlbjFfcHJvY193dCwgYWVzKHk9c2NvcmUsIHg9ZW5kLCBjb2xvdXIgPSBlbmQpKSArIGdlb21fdmlvbGluKGRyYXdfcXVhbnRpbGVzPWMoMC41KSwgZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiRCIpLCBhZXMoZ3JvdXA9ZW5kKSwgc2NhbGUgPSAid2lkdGgiKSArIHhsYWIoIkFtaW5vIGFjaWQiKSArIGdndGl0bGUoIkFzcGFydGljIEFjaWQgdmFyaWFudCBhYnVuZGFuY2Ugc2NvcmVzIikrIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiRCIpLCBhZXMoeD1lbmQsIHk9c2NvcmUpLCBhbHBoYSA9IDAuNzUsIHBvc2l0aW9uPWppdHRlcjEpICsgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz10d2VudHlfY29sb3IpICsgdGhlbWVfYncoKQoKcHRlbl9uX2h5ZHJvZGlmZiA8LSBnZ3Bsb3QocHRlbjFfcHJvY193dCwgYWVzKHk9c2NvcmUsIHg9ZmFjdG9yKHBvc2l0aW9uKSwgY29sb3VyID0gKGh5ZHJvMi1oeWRybzEpKSkgKyBnZW9tX3Zpb2xpbihkcmF3X3F1YW50aWxlcz1jKDAuNSksIGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHN0YXJ0PT0gIk4iKSwgYWVzKGdyb3VwPWZhY3Rvcihwb3NpdGlvbikpLCBzY2FsZSA9ICJ3aWR0aCIpICsgeGxhYigiUG9zaXRpb24gaW4gUFRFTiIpICsgZ2d0aXRsZSgiQXNwYXJhZ2luZSB2YXJpYW50IGFidW5kYW5jZSBzY29yZXMgdy8gaHlkcm9waG9iaWNpdHkgY2hhbmdlIikrIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiTiIpLCBhZXMoeD1mYWN0b3IocG9zaXRpb24pLCB5PXNjb3JlKSwgYWxwaGEgPSAwLjg1LCBwb3NpdGlvbj1qaXR0ZXIyKSArIHNjYWxlX2NvbG9yX2Rpc3RpbGxlcihwYWxldHRlID0gIlNwZWN0cmFsIikgKyB0aGVtZV9idygpCgpwdGVuX2RfaHlkcm9kaWZmIDwtIGdncGxvdChwdGVuMV9wcm9jX3d0LCBhZXMoeT1zY29yZSwgeD1mYWN0b3IocG9zaXRpb24pLCBjb2xvdXIgPSAoaHlkcm8yLWh5ZHJvMSkpKSArIGdlb21fdmlvbGluKGRyYXdfcXVhbnRpbGVzPWMoMC41KSwgZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiRCIpLCBhZXMoZ3JvdXA9ZmFjdG9yKHBvc2l0aW9uKSksIHNjYWxlID0gIndpZHRoIikgKyB4bGFiKCJQb3NpdGlvbiBpbiBQVEVOIikgKyBnZ3RpdGxlKCJBc3BhcnRpYyBBY2lkIHZhcmlhbnQgYWJ1bmRhbmNlIHNjb3JlcyB3LyBoeWRyb3Bob2JpY2l0eSBjaGFuZ2UiKSsgZ2VvbV9wb2ludChkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJEIiksIGFlcyh4PWZhY3Rvcihwb3NpdGlvbiksIHk9c2NvcmUpLCBhbHBoYSA9IDAuODUsIHBvc2l0aW9uPWppdHRlcjIpICsgc2NhbGVfY29sb3JfZGlzdGlsbGVyKHBhbGV0dGUgPSAiU3BlY3RyYWwiKSArIHRoZW1lX2J3KCkKCnBsb3QocHRlbl9hX3NwcmVhZDEpCnBsb3QocHRlbl9hX2FhKQpwbG90KHB0ZW5fcl9zcHJlYWQxKQpwbG90KHB0ZW5fcl9hYSkKcGxvdChwdGVuX25fc3ByZWFkMSkKcGxvdChwdGVuX25faHlkcm9kaWZmKQpwbG90KHB0ZW5fbl9hYSkKcGxvdChwdGVuX2Rfc3ByZWFkMSkKcGxvdChwdGVuX2RfaHlkcm9kaWZmKQpwbG90KHB0ZW5fZF9hYSkKCmBgYApgYGB7cn0KIyBFdmVuIG1vcmUgZnJvbSBhYm92ZS4uLiBwbG90cyBub3QgbmFtZWQKCiNncmFwaHMgZm9yIHByb2xpbmUgKGVxdWl2IHRvIHB0ZW5fcF9zcHJlYWQxLCBwdGVuX3BfYWEsIHB0ZW5fcF9oeWRyb2RpZmYpCmdncGxvdChwdGVuMV9wcm9jX3d0LCBhZXMoeT1zY29yZSwgeD1mYWN0b3IocG9zaXRpb24pLCBjb2xvdXIgPSBlbmQpKSArIGdlb21fdmlvbGluKGRyYXdfcXVhbnRpbGVzPWMoMC41KSwgZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiUCIpLCBhZXMoZ3JvdXA9ZmFjdG9yKHBvc2l0aW9uKSksIHNjYWxlID0gIndpZHRoIikgKyB4bGFiKCJQb3NpdGlvbiBpbiBQVEVOIikgKyBnZ3RpdGxlKCJQcm9saW5lIHZhcmlhbnQgYWJ1bmRhbmNlIHNjb3JlcyIpKyBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHN0YXJ0PT0gIlAiKSwgYWVzKHg9ZmFjdG9yKHBvc2l0aW9uKSwgeT1zY29yZSksIGFscGhhID0gMC44NSwgcG9zaXRpb249aml0dGVyMikgKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPXR3ZW50eV9jb2xvcikgKyB0aGVtZV9idygpCmdncGxvdChwdGVuMV9wcm9jX3d0LCBhZXMoeT1zY29yZSwgeD1lbmQsIGNvbG91ciA9IGVuZCkpICsgZ2VvbV92aW9saW4oZHJhd19xdWFudGlsZXM9YygwLjUpLCBkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJQIiksIGFlcyhncm91cD1lbmQpLCBzY2FsZSA9ICJ3aWR0aCIpICsgeGxhYigiQW1pbm8gYWNpZCIpICsgZ2d0aXRsZSgiUHJvbGluZSB2YXJpYW50IGFidW5kYW5jZSBzY29yZXMiKSsgZ2VvbV9wb2ludChkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJQIiksIGFlcyh4PWVuZCwgeT1zY29yZSksIGFscGhhID0gMC43NSwgcG9zaXRpb249aml0dGVyMSkgKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPXR3ZW50eV9jb2xvcikgKyB0aGVtZV9idygpCmdncGxvdChwdGVuMV9wcm9jX3d0LCBhZXMoeT1zY29yZSwgeD1mYWN0b3IocG9zaXRpb24pLCBjb2xvdXIgPSAoaHlkcm8yLWh5ZHJvMSkpKSArIGdlb21fdmlvbGluKGRyYXdfcXVhbnRpbGVzPWMoMC41KSwgZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiUCIpLCBhZXMoZ3JvdXA9ZmFjdG9yKHBvc2l0aW9uKSksIHNjYWxlID0gIndpZHRoIikgKyB4bGFiKCJQb3NpdGlvbiBpbiBQVEVOIikgKyBnZ3RpdGxlKCJQcm9saW5lIHZhcmlhbnQgYWJ1bmRhbmNlIHNjb3JlcyB3LyBoeWRyb3Bob2JpY2l0eSBjaGFuZ2UiKSsgZ2VvbV9wb2ludChkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJQIiksIGFlcyh4PWZhY3Rvcihwb3NpdGlvbiksIHk9c2NvcmUpLCBhbHBoYSA9IDAuODUsIHBvc2l0aW9uPWppdHRlcjIpICsgc2NhbGVfY29sb3JfZGlzdGlsbGVyKHBhbGV0dGUgPSAiU3BlY3RyYWwiKSArIHRoZW1lX2J3KCkKYGBgCmBgYHtyfQojZ3JhcGhzIGZvciBUaHJlb25pbmUKZ2dwbG90KHB0ZW4xX3Byb2Nfd3QsIGFlcyh5PXNjb3JlLCB4PWZhY3Rvcihwb3NpdGlvbiksIGNvbG91ciA9IGVuZCkpICsgZ2VvbV92aW9saW4oZHJhd19xdWFudGlsZXM9YygwLjUpLCBkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJUIiksIGFlcyhncm91cD1mYWN0b3IocG9zaXRpb24pKSwgc2NhbGUgPSAid2lkdGgiKSArIHhsYWIoIlBvc2l0aW9uIGluIFBURU4iKSArIGdndGl0bGUoIlRocmVvbmluZSB2YXJpYW50IGFidW5kYW5jZSBzY29yZXMiKSsgZ2VvbV9wb2ludChkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJUIiksIGFlcyh4PWZhY3Rvcihwb3NpdGlvbiksIHk9c2NvcmUpLCBhbHBoYSA9IDAuODUsIHBvc2l0aW9uPWppdHRlcjIpICsgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz10d2VudHlfY29sb3IpICsgdGhlbWVfYncoKQpnZ3Bsb3QocHRlbjFfcHJvY193dCwgYWVzKHk9c2NvcmUsIHg9ZW5kLCBjb2xvdXIgPSBlbmQpKSArIGdlb21fdmlvbGluKGRyYXdfcXVhbnRpbGVzPWMoMC41KSwgZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiVCIpLCBhZXMoZ3JvdXA9ZW5kKSwgc2NhbGUgPSAid2lkdGgiKSArIHhsYWIoIkFtaW5vIGFjaWQiKSArIGdndGl0bGUoIlRocmVvbmluZSB2YXJpYW50IGFidW5kYW5jZSBzY29yZXMiKSsgZ2VvbV9wb2ludChkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJUIiksIGFlcyh4PWVuZCwgeT1zY29yZSksIGFscGhhID0gMC43NSwgcG9zaXRpb249aml0dGVyMSkgKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPXR3ZW50eV9jb2xvcikgKyB0aGVtZV9idygpCmdncGxvdChwdGVuMV9wcm9jX3d0LCBhZXMoeT1zY29yZSwgeD1mYWN0b3IocG9zaXRpb24pLCBjb2xvdXIgPSAoaHlkcm8yLWh5ZHJvMSkpKSArIGdlb21fdmlvbGluKGRyYXdfcXVhbnRpbGVzPWMoMC41KSwgZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiVCIpLCBhZXMoZ3JvdXA9ZmFjdG9yKHBvc2l0aW9uKSksIHNjYWxlID0gIndpZHRoIikgKyB4bGFiKCJQb3NpdGlvbiBpbiBQVEVOIikgKyBnZ3RpdGxlKCJUaHJlb25pbmUgdmFyaWFudCBhYnVuZGFuY2Ugc2NvcmVzIHcvIGh5ZHJvcGhvYmljaXR5IGNoYW5nZSIpKyBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHN0YXJ0PT0gIlQiKSwgYWVzKHg9ZmFjdG9yKHBvc2l0aW9uKSwgeT1zY29yZSksIGFscGhhID0gMC44NSwgcG9zaXRpb249aml0dGVyMikgKyBzY2FsZV9jb2xvcl9kaXN0aWxsZXIocGFsZXR0ZSA9ICJTcGVjdHJhbCIpICsgdGhlbWVfYncoKQoKYGBgCgoKYGBge3J9CiMgVG8gcGxvdCBwb3NpdGlvbnMgd2l0aCBsb3cgc3RkZGV2IChleGNsdWRpbmcgbm9uc2Vuc2UpCgojY3JlYXRpbmcgbmV3IGRhdGFmcmFtZSB3aGljaCBpbmNsdWRlcyBtZWFuIGFidW5kYW5jZSBhbmQgdmFyaWFuY2UsIGFuZCBkaXNjbHVkZXMgbm9uc2Vuc2UgbXV0YXRpb25zIChub25zZW5zZSBtdXRhdGlvbnMgY3V0IHByb3RlaW5zIHNob3J0IGFuZCB1c3VhbGx5IHJlc3VsdCBpbiB2ZXJ5IGxvdyBhYnVuZGFuY2Ugc2NvcmVzLCBzbyBJJ3ZlIGRlY2lkZWQgdG8gdHJlYXQgdGhlbSBzZXBhcmF0ZWx5IGZyb20gbWlzc2Vuc2Uvc3lub255bW91cyBtdXRhdGlvbnMpCnB0ZW5fdmFyaWFuY2UgPC0gc3VtbWFyeVNFKChzdWJzZXQocHRlbjFfZGF0YSwgZW5kICE9ICJYIikpLCBtZWFzdXJldmFyPSJzY29yZSIsIGdyb3VwdmFycz0icG9zaXRpb24iLCBuYS5ybT1UUlVFKQoKIyBGaWx0ZXJpbmcgZm9yIHBvc2l0aW9ucyB3aXRoIGVub3VnaCB2YXJpYW50cyBhbmQgbG93IHZhcmlhbmNlIGluIHZhcmlhbnQgYWJ1bmRhbmNlIHNjb3JlcwojYWRqdXN0IE4gKG1pbmltdW0gIyB2YXJpYW50cyBhdCBhIHBvc2l0aW9uKSBhbmQgc3RkZGV2IHRvIGxpa2luZwojNSwgMC4xMQojMTAsIDAuMTUKcHRlbl92YXJpYW5jZV9maWx0ZXJlZCA8LSBzdWJzZXQoc3Vic2V0KHB0ZW5fdmFyaWFuY2UsIE4gPiA4ICksIHNkIDwgMC4xMSkKCiNub25zZW5zZSB2YXJpYW50IHNjb3JlcyBhcmUgZ3JhcGhlZCBhcyBkb3RzLCBidXQgYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGUgb3ZlcmxheWluZyB2aW9saW4gcGxvdHMKZ2dwbG90KG5vX25vbnNlbnNlLCBhZXMoeT1zY29yZSwgeD1mYWN0b3IocG9zaXRpb24pLCBjb2xvdXIgPSBlbmQpKSArIAogIGdlb21fdmlvbGluKGRyYXdfcXVhbnRpbGVzPWMoMC41KSwgZGF0YT1zdWJzZXQobm9fbm9uc2Vuc2UsIG5vX25vbnNlbnNlJHBvc2l0aW9uICVpbiUgcHRlbl92YXJpYW5jZV9maWx0ZXJlZCRwb3NpdGlvbiksIGFlcyhncm91cD1mYWN0b3IocG9zaXRpb24pKSwgc2NhbGUgPSAid2lkdGgiKSArIAogIHhsYWIoIlBvc2l0aW9uIGluIFBURU4iKSArIGdndGl0bGUoIkludG9sZXJhbnQgYW5kIHRvbGVyYW50IGFtaW5vIGFjaWQgcG9zaXRpb25zIikgKwogIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgcHRlbjFfcHJvY193dCRwb3NpdGlvbiAlaW4lIHB0ZW5fdmFyaWFuY2VfZmlsdGVyZWQkcG9zaXRpb24pLCBhZXMoeD1mYWN0b3IocG9zaXRpb24pLCB5PXNjb3JlKSwgYWxwaGEgPSAwLjg1LCBwb3NpdGlvbj1qaXR0ZXIxKSArIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9dHdlbnR5X2NvbG9yKSArIHRoZW1lX2J3KCkKCmdncGxvdChub19ub25zZW5zZSwgYWVzKHk9c2NvcmUsIHg9cG9zaXRpb24sIGNvbG91ciA9IGVuZCkpICsgCiAgZ2VvbV92aW9saW4oZHJhd19xdWFudGlsZXM9YygwLjUpLCBkYXRhPXN1YnNldChub19ub25zZW5zZSwgbm9fbm9uc2Vuc2UkcG9zaXRpb24gJWluJSBwdGVuX3ZhcmlhbmNlX2ZpbHRlcmVkJHBvc2l0aW9uKSwgYWVzKGdyb3VwPXBvc2l0aW9uJSU0NTApLCBzY2FsZSA9ICJ3aWR0aCIpICsgCiAgeGxhYigiUG9zaXRpb24gaW4gUFRFTiIpICsgZ2d0aXRsZSgiSW50b2xlcmFudCBhbmQgdG9sZXJhbnQgYW1pbm8gYWNpZCBwb3NpdGlvbnMiKSArCiAgZ2VvbV9wb2ludChkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBwdGVuMV9wcm9jX3d0JHBvc2l0aW9uICVpbiUgcHRlbl92YXJpYW5jZV9maWx0ZXJlZCRwb3NpdGlvbiksIGFlcyh4PXBvc2l0aW9uLCB5PXNjb3JlKSwgYWxwaGEgPSAwLjg1LCBwb3NpdGlvbj1qaXR0ZXIxKSArIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9dHdlbnR5X2NvbG9yKSArIHRoZW1lX2J3KCkKCmBgYApgYGB7cn0KIyBSZXBlYXQgb2YgYWJvdmUgLGp1c3QgdGVzdGluZyBkaWZmZXJlbnQgTiBhbmQgc3RkZGV2IHBhcmFtZXRlciAKcHRlbl92YXJpYW5jZV9maWx0ZXJlZDEgPC0gc3Vic2V0KHN1YnNldChwdGVuX3ZhcmlhbmNlLCBOID4gMTApLCBzZCA+IDAuMjUpCgpnZ3Bsb3Qobm9fbm9uc2Vuc2UsIGFlcyh5PXNjb3JlLCB4PWZhY3Rvcihwb3NpdGlvbiksIGNvbG91ciA9IGVuZCkpICsgCiAgZ2VvbV92aW9saW4oZHJhd19xdWFudGlsZXM9YygwLjUpLCBkYXRhPXN1YnNldChub19ub25zZW5zZSwgbm9fbm9uc2Vuc2UkcG9zaXRpb24gJWluJSBwdGVuX3ZhcmlhbmNlX2ZpbHRlcmVkMSRwb3NpdGlvbiksIGFlcyhncm91cD1mYWN0b3IocG9zaXRpb24pKSwgc2NhbGUgPSAid2lkdGgiKSArIAogIHhsYWIoIlBvc2l0aW9uIGluIFBURU4iKSArIGdndGl0bGUoIkludG9sZXJhbnQgYW5kIHRvbGVyYW50IGFtaW5vIGFjaWQgcG9zaXRpb25zIikgKwogIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgcHRlbjFfcHJvY193dCRwb3NpdGlvbiAlaW4lIHB0ZW5fdmFyaWFuY2VfZmlsdGVyZWQxJHBvc2l0aW9uKSwgYWVzKHg9ZmFjdG9yKHBvc2l0aW9uKSwgeT1zY29yZSksIGFscGhhID0gMC44NSwgcG9zaXRpb249aml0dGVyMSkgKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPXR3ZW50eV9jb2xvcikgKyB0aGVtZV9idygpCgpnZ3Bsb3Qobm9fbm9uc2Vuc2UsIGFlcyh5PXNjb3JlLCB4PXBvc2l0aW9uLCBjb2xvdXIgPSBlbmQpKSArIAogIGdlb21fdmlvbGluKGRyYXdfcXVhbnRpbGVzPWMoMC41KSwgZGF0YT1zdWJzZXQobm9fbm9uc2Vuc2UsIG5vX25vbnNlbnNlJHBvc2l0aW9uICVpbiUgcHRlbl92YXJpYW5jZV9maWx0ZXJlZDEkcG9zaXRpb24pLCBhZXMoZ3JvdXA9cG9zaXRpb24lJTQ1MCksIHNjYWxlID0gIndpZHRoIikgKyAKICB4bGFiKCJQb3NpdGlvbiBpbiBQVEVOIikgKyBnZ3RpdGxlKCJJbnRvbGVyYW50IGFuZCB0b2xlcmFudCBhbWlubyBhY2lkIHBvc2l0aW9ucyIpICsKICBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHB0ZW4xX3Byb2Nfd3QkcG9zaXRpb24gJWluJSBwdGVuX3ZhcmlhbmNlX2ZpbHRlcmVkMSRwb3NpdGlvbiksIGFlcyh4PXBvc2l0aW9uLCB5PXNjb3JlKSwgYWxwaGEgPSAwLjg1LCBwb3NpdGlvbj1qaXR0ZXIxKSArIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9dHdlbnR5X2NvbG9yKSArIHRoZW1lX2J3KCkKCgojIENoZWNraW5nIHRvIHNlZSB2YXJpYW50IHNjb3JlcyBvZiBwb3NpdGlvbnMgd2hlcmUgY2xpbnZhciBoYXMgZG9jdW1lbnRlZCBleGlzdGVuY2Ugb2YgYSBwYXRoL2xpa2VseSBwYXRoIHZhcmlhbnQgaW4gdGhlIHBvc2l0aW9uCiNjaG9zZW4gaW5jbHVkZXMgcG9zaXRpb25zIG9mIGNsaW52YXIgdmFyaWFudHMKY2hvc2VuIDwtIGMoNjEsIDY4LCAxMDUsIDEwOCwgMTIzLCAxMjcsIDEzMCwgMTMyLCAxMzUsIDE1NSwgMTY1LCAxNzMsIDE3NCwgMjQ2LCAzMjMsIDMzNSkKCmdncGxvdChwdGVuMV9wcm9jX3d0LCBhZXMoeT1zY29yZSwgeD1mYWN0b3IocG9zaXRpb24pLCBjb2xvdXIgPSBlbmQpKSArIAogIGdlb21fdmlvbGluKGRyYXdfcXVhbnRpbGVzPWMoMC41KSwgZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgcHRlbjFfcHJvY193dCRwb3NpdGlvbiAlaW4lIGNob3NlbiksIGFlcyhncm91cD1mYWN0b3IocG9zaXRpb24pKSwgc2NhbGUgPSAid2lkdGgiKSArIAogIHhsYWIoIlBvc2l0aW9uIGluIFBURU4iKSArIGdndGl0bGUoIkNsaW52YXIgcGF0aC9saWtlbHkgcGF0aCB2YXJpYW50IHBvc2l0aW9ucyIpICsKICBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHB0ZW4xX3Byb2Nfd3QkcG9zaXRpb24gJWluJSBjaG9zZW4pLCBhZXMoeD1mYWN0b3IocG9zaXRpb24pLCB5PXNjb3JlKSwgYWxwaGEgPSAwLjg1LCBwb3NpdGlvbj1qaXR0ZXIxKSArIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9dHdlbnR5X2NvbG9yKSArIHRoZW1lX2J3KCkKI2V4cGVjdGVkIHRvIHNlZSBzb21lIHBvc2l0aW9ucyB3aXRoIHZhcmlhbnRzIGFsbCB3aXRoIGxvdyBhYnVuZGFuY2UsIHdoaWNoIHdhcyBzb21ld2hhdCB0aGUgY2FzZT8gNjgsIDEwNSwgMTU1LCAyNTYgbWF5IHNob3cgdGhpcwojcmVzdWx0cyB0aGF0IGRpZmZlciBtYXkgcmVmbGVjdCB0aGF0IGFjdHVhbCB2YXJpYW50IGFhIHF1YWxpdGllcywgYW5kIG5vdCBqdXN0IHBvc2l0aW9uLCBhZmZlY3QgYWJ1bmRhbmNlIHNjb3JlCgpgYGAKYGBge3IgaW5jbHVkZT1GQUxTRX0KIyBQbG90dGluZyB3aGljaCBwb3NpdGlvbnMgaW4gdGhlIHByb3RlaW4gaGF2ZSBsb3cgdmFyaWFuY2UgaW4gYWJ1bmRhbmNlcyBzY29yZXMsIHdhcyBwb3RlbnRpYWxseSBnb2luZyB0byB1c2UgYXMgYW4gYWRkaXRpb25hbCBpbiB0aGUgaGVhdC1tZWFuLXZhcmlhbmNlLXNlY29uZGFyeS1zdHJ1Y3QgcGxvdCwgYnV0IHR1cm5lZCBvdXQgLi4uIHF1aXRlIHBvb3JseQoKZ2dwbG90KG5vX25vbnNlbnNlLCBhZXMoeT1zY29yZSwgeD1wb3NpdGlvbikpICsgCiAgZ2VvbV9iYXIoZGF0YT1zdWJzZXQobm9fbm9uc2Vuc2UsIG5vX25vbnNlbnNlJHBvc2l0aW9uICVpbiUgcHRlbl92YXJpYW5jZV9maWx0ZXJlZDEkcG9zaXRpb24pLCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgpLCBzdGF0PSJpZGVudGl0eSIsIGNvbG91cj0iIzk5OTk5OSIpICsKICBnZW9tX2Vycm9yYmFyKGRhdGE9c3Vic2V0KG5vX25vbnNlbnNlLCBub19ub25zZW5zZSRwb3NpdGlvbiAlaW4lIHB0ZW5fdmFyaWFuY2VfZmlsdGVyZWQxJHBvc2l0aW9uKSwgYWVzKHltaW49c2NvcmUtc2QsIHltYXg9c2NvcmUrc2QpLCB3aWR0aD0xLCBzaXplPTAuMywgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoKSkgKwogIHhsYWIoIlBvc2l0aW9uIGluIFBURU4iKSArIGdndGl0bGUoIkludG9sZXJhbnQgYW5kIHRvbGVyYW50IGFtaW5vIGFjaWQgcG9zaXRpb25zIikgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgNDAzLCAyMCksIGV4cGFuZCA9IGMoMCwwKSkgKyBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApKSt0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksIGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLCBsZWdlbmQucG9zaXRpb249Im5vbmUiKQoKcHRlbl92YXJpYW5jZV9maWx0ZXJlZDIgPC0gc3Vic2V0KHN1YnNldChwdGVuX3ZhcmlhbmNlLCBOID4gMTApLCBzZCA+IDAuMzUpCgpnZ3Bsb3Qobm9fbm9uc2Vuc2UsIGFlcyh5PXNkLCB4PXBvc2l0aW9uKSkgKwogIGdlb21fYmFyKGRhdGE9c3Vic2V0KG5vX25vbnNlbnNlLCBub19ub25zZW5zZSRwb3NpdGlvbiAlaW4lIHB0ZW5fdmFyaWFuY2VfZmlsdGVyZWQkcG9zaXRpb24pLCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgpLCBzdGF0PSJpZGVudGl0eSIsIGNvbG91cj0iIzk5OTk5OSIpCgojYWxsIHNkIG92ZXIgLjI1LCBOPjEwCmdncGxvdChwdGVuX3N1bSwgYWVzKHk9c2QsIHg9cG9zaXRpb24pKSArCiAgZ2VvbV9wb2ludChkYXRhPXN1YnNldChwdGVuX3N1bSwgcHRlbl9zdW0kcG9zaXRpb24gJWluJSBwdGVuX3ZhcmlhbmNlX2ZpbHRlcmVkMSRwb3NpdGlvbikpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDQwMywgMjApLCBleHBhbmQgPSBjKDAsMCkpICsgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSkrdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLCBheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwgbGVnZW5kLnBvc2l0aW9uPSJub25lIikKCgojYWxsIHNkCmdncGxvdChwdGVuX3N1bSwgYWVzKHk9c2QsIHg9cG9zaXRpb24pKSArCiAgZ2VvbV9zZWdtZW50KGFlcyh4PXBvc2l0aW9uLCB4ZW5kPXBvc2l0aW9uLCB5PTAsIHllbmQ9c2QpLCBjb2xvcj0iZ3JleTQ4IikgKwogICNnZW9tX3BvaW50KCkgKwogICNnZW9tX2Vycm9yYmFyKGRhdGE9c3Vic2V0KG5vX25vbnNlbnNlLCBub19ub25zZW5zZSRwb3NpdGlvbiAlaW4lIHB0ZW5fdmFyaWFuY2VfZmlsdGVyZWQyJHBvc2l0aW9uKSwgYWVzKHltaW49c2NvcmUtc2QsIHltYXggPSBzY29yZStzZCksIHdpZHRoPTEsIHNpemU9MC4zLCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgpKSArIAogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgNDAzLCAyMCksIGV4cGFuZCA9IGMoMCwwKSkgKyBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApKSt0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksIGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLCBsZWdlbmQucG9zaXRpb249Im5vbmUiKQoKcHRlbl9zdW1fZmlsdCA8LSBwdGVuX3N1bQpwdGVuX3N1bV9maWx0JHNkMiA9IHB0ZW5fdmFyaWFuY2VfZmlsdGVyZWQ0W21hdGNoKHB0ZW5fc3VtX2ZpbHQkcG9zaXRpb24sIHB0ZW5fdmFyaWFuY2VfZmlsdGVyZWQ0JHBvc2l0aW9uKSwgInNkIl0KcHRlbl9wb3NfY29sb3JlZF9tZWFuIDwtIGdncGxvdChwdGVuX3N1bV9maWx0LCBhZXMoeD1wb3NpdGlvbiwgeT1zY29yZSkpKyBnZW9tX2Jhcihwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgpLCBzdGF0PSJpZGVudGl0eSIsIGNvbG91cj1wdGVuX3N1bV9maWx0JHNkMikgKyBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPXNjb3JlLXNkLCB5bWF4ID0gc2NvcmUrc2QpLCB3aWR0aD0xLCBzaXplPTAuMywgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoKSkgK3lsYWIoIlZBTVAtc2VxIHNjb3JlIikrdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLCBheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSkgKyBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDQwMywgMjApLCBleHBhbmQgPSBjKDAsMCkpICsgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSkgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MTg1LCBjb2xvcj0iYmxhY2siLCBzaXplPS4xKSArIGdlb21fdmxpbmUoeGludGVyY2VwdD0zNTAsIGNvbG9yPSJibGFjayIsIHNpemU9LjEpKyBzY2FsZV9jb2xvdXJfZ3JhZGllbnQobG93ID0gIndoaXRlIiwgaGlnaCA9ICJibHVlIikKcGxvdChwdGVuX3Bvc19jb2xvcmVkX21lYW4pCiMgRm9jdXNpbmcgb24gaW5kaXZpZHVhbCAiZW5kIiwgb3IgdmFyaWFudCwgYW1pbm8gYWNpZHMhIEEgbG90IG1vcmUgY2FuIGJlIGRvbmUgd2l0aCB0aGlzLCBhbmQgYSBsb3QgbmVlZHMgdG8gYmUgaW1wcm92ZWQKYGBgCgoKCmBgYHtyfQojIE5ldyB0cmFjayBmb3IgaGVhdC1tZWFuLXZhcmlhbmNlLXNlY29uZGFyeS1zdHJ1Y3QgcGxvdAoKI3RoaXMgaXMgaG93IHB0ZW5fdmFyaWFuY2Ugd2FzIGRlZmluZWQ6IHB0ZW5fdmFyaWFuY2UgPC0gc3VtbWFyeVNFKChzdWJzZXQocHRlbjFfZGF0YSwgZW5kICE9ICJYIikpLCBtZWFzdXJldmFyPSJzY29yZSIsIGdyb3VwdmFycz0icG9zaXRpb24iLCBuYS5ybT1UUlVFKQpwdGVuX3ZhcmlhbmNlX2ZpbHRlcmVkNCA8LXN1YnNldChwdGVuX3ZhcmlhbmNlLCBOPjUpCnZhcmlhbmNlX2JhciA8LSBnZ3Bsb3QocHRlbl92YXJpYW5jZV9maWx0ZXJlZDQsIGFlcyh5PXNkLCB4PXBvc2l0aW9uKSkgKwogIGdlb21fc2VnbWVudChhZXMoeD1wb3NpdGlvbiwgeGVuZD1wb3NpdGlvbiwgeT0wLCB5ZW5kPXNkKSwgY29sb3I9ImdyZXk2OCIpICsKICBnZW9tX3BvaW50KHNpemU9MC41KSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCA0MDMsIDIwKSwgZXhwYW5kID0gYygwLDApKSArIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCkpK3RoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwgYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCnBsb3QodmFyaWFuY2VfYmFyKQoKZ2Q9Z2dwbG90X2d0YWJsZShnZ3Bsb3RfYnVpbGQodmFyaWFuY2VfYmFyKSkKbWF4V2lkdGggPSBncmlkOjp1bml0LnBtYXgoZ2Ekd2lkdGhzLCBnYiR3aWR0aHMsIGdjJHdpZHRocywgZ2Qkd2lkdGhzKQpnYSR3aWR0aHMgPC0gYXMubGlzdChtYXhXaWR0aCkKZ2Ikd2lkdGhzIDwtIGFzLmxpc3QobWF4V2lkdGgpCmdjJHdpZHRocyA8LSBhcy5saXN0KG1heFdpZHRoKQpnZCR3aWR0aHMgPC0gYXMubGlzdChtYXhXaWR0aCkKZ3JpZC5uZXdwYWdlKCkKCiMjc3RvcmluZywgd2l0aCBzcGVjaWZpZWQgd2lkdGhzISEKI3BkZigncHRlbl90cG10X21lYW5faGVhdF92YXJpYW5jZS5wZGYnLCB3aWR0aD04LCBoZWlnaHQ9NikKI2dyaWQuYXJyYW5nZShhcnJhbmdlR3JvYihnYyxnZCxnYSxnYixucm93PTQsaGVpZ2h0cz1jKC4xLC4xNSwuMTUsLjYpKSkKI2Rldi5vZmYoKQpgYGAKCgpgYGB7ciBpbmNsdWRlPUZBTFNFfQojb24gaG9sZCwgY3JlYXRpb24gb2YgYW1pbm8gYWNpZCBkYXRhZnJhbWUgdG8gcGxvdCBhYnVuZGFuY2Ugc2NvcmVzIGFnYWluc3QKbmFtZSA8LSBjKCdBbGEnLCAnQXJnJywgJ0FzbicsICdBc3AnLCAnQ3lzJywgJ0dsdScsICdHbG4nLCAnR2x5JywgJ0hpcycsICdJbGUnLCAnTGV1JywgJ0x5cycsICdNZXQnLCAnUGhlJywgJ1BybycsICdTZXInLCAnVGhyJywgJ1RycCcsICdUeXInLCAnVmFsJykKcXVhbGl0eSA8LSBjKCdIeWRyb3Bob2JpYycsICdCYXNpYycsICdQb2xhciBOZXV0cmFsJywgJ0FjaWRpYycsICdQb2xhciBOZXV0cmFsJywgJ0FjaWRpYycsICdQb2xhciBOZXV0cmFsJywgJ0dseWNpbmUnLCAnQmFzaWMnLCAnSHlkcm9waG9iaWMnLCAnSHlkcm9waG9iaWMnLCAnQmFzaWMnLCAnSHlkcm9waG9iaWMnLCAnSHlkcm9waG9iaWMnLCAnSHlkcm9waG9iaWMnLCAnUG9sYXIgTmV1dHJhbCcsICdQb2xhciBOZXV0cmFsJywgJ0h5ZHJvcGhvYmljJywgJ0h5ZHJvcGhvYmljJywgJ0h5ZHJvcGhvYmljJykKI2FidW5kYW5jZSA8LSBnZXQgYmV0dGVyIHNjYWxlCmFidW5kYW5jZSA8LSBjKDAuMDg4NCwgMC4wNTcsIDAuMDQxNywgMC4wNTM5LCAwLjAxMjQsIDAuMDYyNCwgMC4wMzgyLCAwLjA3MDMsIDAuMDIyMCwgMC4wNTk1LCAwLjA5OTQsIDAuMDUyNywgMC4wMjM3LCAwLjA0LCAwLjA0NzEsIDAuMDY3MiwgMC4wNTQzLCAwLjAxMjEsIDAuMDMsIDAuMDY3NykKI2lzb2VsZWN0cmljIHBvaW50IDwtIHVua25vd24gc291cmNlIChuY2JpKQppc29lbGVjdHJpYyA8LSBjKDYsIDEwLjgsIDUuNCwgMywgNSwgMy4yLCA1LjcsIDYsIDcuNiwgNiwgNiwgOS43LCA1LjcsIDUuNSwgNi4zLCA1LjcsIDUuNiwgNS45LCA1LjcsIDYuMCkKaHBfa19kIDwtIGMoMS44LCAtNC41LCAtMy41LCAtMy41LCAyLjUsIC0zLjUsIC0zLjUsIC0wLjQsIC0zLjIsIDQuNSwgMy44LCAtMy45LCAxLjksIDIuOCwgLTEuNiwgLTAuOCwgLTAuNywgLTAuOSwgLTEuMywgNC4yKQpocF9qYW5pbiA8LWMoMC4zLCAtMS40LCAtMC41LCAtMC42LCAwLjksIC0wLjcsIC0wLjcsIDAuMywgLTAuMSwgMC43LCAwLjUsIC0xLjgsIDAuNCwgMC41LCAtMC4zLCAtMC4xLCAtMC4yLCAwLjMsIC0wLjQsIDAuNikKI01vbmVyYSBldCBhbC4sIEouIFByb3RlaW4gU2NpIChwcm8gKC00NikgbWF5IGJlIHNrZXRjaCkKaHBfcGg3IDwtIGMoNDEsIC0xNCwgLTI4LCAtNTUsIDQ5LCAtMzEsIC0xMCwgMCwgOCwgOTksIDk3LCAtMjMsIDc0LCAxMDAsIC00NiwgLTUsIDEzLCA5NywgNjMsIDc2KQpoX2JvbmRzIDwtIGMoMCwgNywgNSwgNCwgMCwgNCwgNSwgMCwgMywgMCwgMCwgMywgMCwgMCwgMCwgMywgMywgMSwgMywgMCkKbW9sX3dlaWdodCA8LWMoNzEsIDE1NiwgMTE0LCAxMTUsIDEwMywgMTI5LCAxMjgsIDU3LCAxMzcsIDExMywgMTEzLCAxMjgsIDEzMSwgMTQ3LCA5NywgODcsIDEwMSwgMTg2LCAxNjMsIDk5KQoKYW1pbm9fYWNpZHMuZGF0YSA8LSBkYXRhLmZyYW1lKG5hbWUsIHF1YWxpdHksIGFidW5kYW5jZSwgaXNvZWxlY3RyaWMsIGhwX2tfZCwgaHBfamFuaW4sIGhwX3BoNywgaF9ib25kcywgbW9sX3dlaWdodCkKCmBgYAoKYGBge3J9CiMgTXVsdGlwbGV4IHBhcGVyJ3MgRmlnMmIgKFBURU4pIHNob3dzIHRyYWlsaW5nIHRhaWxzIGZvciB0aGUgbm9uc2Vuc2UgYW5kIHN5bm9ueW1vdXMgdmFyaWFudCBzY29yZXMKIyB0aGlzIGlzIHRvIGlkZW50aWZ5IGFuZCBpbnZlc3RpZ2F0ZSB3aHkgdmFyaWFudHMgaW4gdGhpcyB0YWlsIGFyZSBzbyBmYXIgZnJvbSB0aGVpciBtZWFucwoKcHRlbjFfbm9uc2Vuc2UgPC0gc3Vic2V0KHB0ZW4xX3Byb2MsIGNsYXNzID09ICJub25zZW5zZSIpCnRwbXQxX25vbnNlbnNlIDwtIHN1YnNldCh0cG10MV9wcm9jLCBjbGFzcyA9PSAibm9uc2Vuc2UiKQpwdGVuMV9zeW5vbiA8LSBzdWJzZXQocHRlbjFfcHJvYywgY2xhc3MgPT0gInN5bm9ueW1vdXMiKQp0cG10MV9zeW5vbiA8LSBzdWJzZXQodHBtdDFfcHJvYywgY2xhc3MgPT0gInN5bm9ueW1vdXMiKQoKcHRlbjFfbm9fbWlzc2Vuc2UgPC0gc3Vic2V0KHB0ZW4xX3Byb2MsIGNsYXNzID09ICJzeW5vbnltb3VzIiB8IGNsYXNzID09ICJub25zZW5zZSIpCgpnZ3Bsb3QocHRlbjFfbm9uc2Vuc2UsIGFlcyh4PXNjb3JlKSkgKyBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aD0uMDEsIGNvbG91cj0iYmx1ZSIsIGZpbGw9IndoaXRlIikgKyB0aGVtZV9idygpCiMrIGdlb21fZGVuc2l0eSgpCmdncGxvdChwdGVuMV9zeW5vbiwgYWVzKHg9c2NvcmUpKSArIGdlb21faGlzdG9ncmFtKGJpbndpZHRoPS4wMSwgY29sb3VyPSJyZWQiLCBmaWxsPSJ3aGl0ZSIpICsgdGhlbWVfYncoKQoKZ2dwbG90KHB0ZW4xX3Byb2Nfd3QsIGFlcyh4PXNjb3JlKSkgKyBnZW9tX2hpc3RvZ3JhbShkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LGNsYXNzID09ICJub25zZW5zZSIpLCBmaWxsID0gInJlZCIsIGFscGhhID0gMC41LCBiaW53aWR0aD0uMDEpICsgZ2VvbV9oaXN0b2dyYW0oZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCxjbGFzcyA9PSAic3lub255bW91cyIpLCBmaWxsID0gImJsdWUiLCBhbHBoYSA9IDAuNSwgYmlud2lkdGg9LjAxKSArIGdlb21faGlzdG9ncmFtKGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsY2xhc3MgPT0gIm1pc3NlbnNlIiksIGZpbGwgPSAiZ3JlZW4iLCBhbHBoYSA9IDAuMiwgYmlud2lkdGg9LjAxKSArIHRoZW1lX2J3KCkKCmdncGxvdChwdGVuMV9ub19taXNzZW5zZSwgYWVzKHg9c2NvcmUpKSArIGdlb21faGlzdG9ncmFtKGRhdGE9c3Vic2V0KHB0ZW4xX25vX21pc3NlbnNlLGNsYXNzID09ICJub25zZW5zZSIpLCBmaWxsID0gInJlZCIsIGFscGhhID0gMC41LCBiaW53aWR0aD0uMDEpICsgZ2VvbV9oaXN0b2dyYW0oZGF0YT1zdWJzZXQocHRlbjFfbm9fbWlzc2Vuc2UsY2xhc3MgPT0gInN5bm9ueW1vdXMiKSwgZmlsbCA9ICJibHVlIiwgYWxwaGEgPSAwLjUsIGJpbndpZHRoPS4wMSkgKyB0aGVtZV9idygpCgojIFRQTVQKI2dncGxvdCh0cG10MV9ub25zZW5zZSwgYWVzKHg9c2NvcmUpKSArIGdlb21faGlzdG9ncmFtKGJpbndpZHRoPS4wMSwgY29sb3VyPSJibHVlIiwgZmlsbD0id2hpdGUiKSArIHRoZW1lX2J3KCkKI2dncGxvdCh0cG10MV9zeW5vbiwgYWVzKHg9c2NvcmUpKSArIGdlb21faGlzdG9ncmFtKGJpbndpZHRoPS4wMSwgY29sb3VyPSJyZWQiLCBmaWxsPSJ3aGl0ZSIpICsgdGhlbWVfYncoKQoKCiMgd2UgY2FuIHNlZSB0aGUgcGFwZXIgdXNlZCBhIGRpZmZlcmVudCBzY2FsZSwgd2hpY2ggd2FzIC4uLiBkZWNlaXZpbmcKIyBub3QgbWFueSB2YXJpYW50cyBhcmUgbm9uc2Vuc2Ugb3Igc3lub255bW91cywgc28gdGhlIHRhaWwgaXMgbm90IGFjdHVhbGx5IHRoYXQgbGFyZ2UgZm9yIGJvdGggb2YgdGhlbQpgYGAKYGBge3J9CiMgVGFraW5nIGEgc3Vic2V0IG9mIHRoZSBkYXRhLCBhbGwgdmFyaWFudHMgYWJvdmUgYSBjZXJ0YWluIHNjb3JlIChmb3Igbm9uc2Vuc2UpLCBhbmQgYmVsb3cgYSBjZXJ0YWluIHNjb3JlIChmb3Igc3lub255bW91cykKCiMwLjU1Cm5vbnNlbnNlX3RhaWwgPC0gc3Vic2V0KHB0ZW4xX25vbnNlbnNlLCBzY29yZSA+IDAuNikKc3lub25fdGFpbCA8LSBzdWJzZXQocHRlbjFfc3lub24sIHNjb3JlIDwgMC42KQpub25zZW5zZV90YWlsJHNlY29uZGFyeV9zdHJ1Y3QgPC0gaWZlbHNlKGlzLm5hKG5vbnNlbnNlX3RhaWwkaGVsaXgpLCAidW5rbm93biIsCiAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShub25zZW5zZV90YWlsJGhlbGl4PT0xLCAiaGVsaXgiLAogICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uobm9uc2Vuc2VfdGFpbCRzaGVldD09MSwgInNoZWV0IiwKICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKG5vbnNlbnNlX3RhaWwkaGVsaXg9PTAsICJuZWl0aGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgInVua25vd24iKSkpKQpzeW5vbl90YWlsJHNlY29uZGFyeV9zdHJ1Y3QgPC0gaWZlbHNlKGlzLm5hKHN5bm9uX3RhaWwkaGVsaXgpLCAidW5rbm93biIsCiAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzeW5vbl90YWlsJGhlbGl4PT0xLCAiaGVsaXgiLAogICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3lub25fdGFpbCRzaGVldD09MSwgInNoZWV0IiwKICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN5bm9uX3RhaWwkaGVsaXg9PTAsICJuZWl0aGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgInVua25vd24iKSkpKQoKbl90YWlsIDwtIG5vbnNlbnNlX3RhaWxbLGMoMSwyLDcsMzAsMTI3KV0Kc190YWlsIDwtIHN5bm9uX3RhaWxbLGMoMSwyLDcsMzAsMTI3KV0Kbl90YWlsJGJwX3BvcyA8LSAobl90YWlsJHBvc2l0aW9uLTEpKjMKc190YWlsJGJwX3BvcyA8LSAoc190YWlsJHBvc2l0aW9uLTEpKjMKCm5fdGFpbApzX3RhaWwKYGBgCmBgYHtyfQojIEdyYXBoaW5nIHRoZSBwb3NpdGlvbnMgb2YgdGhlc2UgdmFyaWFudHMgaW4gdGhlIHByb3RlaW4KI2p1c3QgaW4gY2FzZSB0aGVyZSBpcyBhIGRpc2Nlcm5pYmxlIHBhdHRlcm4Kc190YWlsX3BvcyA8LSBnZ3Bsb3Qoc190YWlsLCBhZXMoeD1wb3NpdGlvbiwgeT1zY29yZSwgY29sb3VyPXNlY29uZGFyeV9zdHJ1Y3QpKSsgZ2VvbV9wb2ludChzaXplPS4zKSArIHNjYWxlX3hfY29udGludW91cyhtaW5vcl9icmVha3MgPSBzZXEoMCwgNDA1LCA1KSkgKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoIiNGRjQ4NDgiLCAiIzAwQzg1MyIsICIjNTc1N0ZGIiwgIiNBOUE5QTkiKSkgK3lsYWIoIlZBTVAtc2VxIHNjb3JlIikreGxhYigiUG9zaXRpb24gaW4gUFRFTiIpK2xhYnMoY29sb3VyPSJTZWNvbmRhcnkgU3RydWN0dXJlIikrZ2d0aXRsZSgiUFRFTiBzeW5vbnltb3VzIHZhcmlhbnQgdGFpbCBzY29yZXMgaW4gcmVsYXRpb24gdG8gcHJvdGVpbiBzdHJ1Y3R1cmUiKSArIHRoZW1lX2J3KCkKcGxvdChzX3RhaWxfcG9zKQoKbl90YWlsX3BvcyA8LSBnZ3Bsb3Qobl90YWlsLCBhZXMoeD1wb3NpdGlvbiwgeT1zY29yZSwgY29sb3VyPXNlY29uZGFyeV9zdHJ1Y3QpKSsgZ2VvbV9wb2ludChzaXplPS4zKSArIHNjYWxlX3hfY29udGludW91cyhtaW5vcl9icmVha3MgPSBzZXEoMCwgNDA1LCA1KSkgKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoIiNGRjQ4NDgiLCAiIzAwQzg1MyIsICIjNTc1N0ZGIiwgIiNBOUE5QTkiKSkgK3lsYWIoIlZBTVAtc2VxIHNjb3JlIikreGxhYigiUG9zaXRpb24gaW4gUFRFTiIpK2xhYnMoY29sb3VyPSJTZWNvbmRhcnkgU3RydWN0dXJlIikrZ2d0aXRsZSgiUFRFTiBub25zZW5zZSB2YXJpYW50IHRhaWwgc2NvcmVzIGluIHJlbGF0aW9uIHRvIHByb3RlaW4gc3RydWN0dXJlIikgKyB0aGVtZV9idygpCnBsb3Qobl90YWlsX3BvcykKCiMgc3lub255bW91cyBhcmUgc2NhdHRlcmVkIHRocm91Z2hvdXQgcHJvdGVpbgojIG1ha2VzIHNlbnNlIHRoYXQgbm9uc2Vuc2UgbXV0YXRpb25zIG9jY3VyaW5nIGF0IHRhaWwgZW5kIG9mIHByb3RlaW4gaGF2ZSBoaWdoZXIgYWJ1bmRhbmNlCmBgYAoKYGBge3IgaW5jbHVkZT1GQUxTRX0KIyBvcmlnaW5hbGx5IHRvIHNlZSBpZiBsb3cgYWJ1bmRhbmNlIHN5bm9ueW1vdXMgdmFyaWFudHMgaGFkIGFueXRoaW5nIHRvIGRvIHdpdGggc3BsaWNlIHNpdGVzLCBidXQgb25jZSBhZ2FpbiwgdGhlIHdheSB0aGUgbGlicmFyeSBvZiBwcm90ZWlucyB3YXMgY29uc3RydWN0ZWQgZWxpbWluYXRlcyBzcGxpY2Ugc2l0ZXMgYXMgYSBwb3NzaWJpbGl0eQpzX3RhaWwkcHJvYl9BR19HVCA8LSBjKDAsIDEvNiwgMS8yLCAwLCAxLzIsIDEvNikKc190YWlsJHByb2JfdGl0diA8LSBjKDAsIDIvMywgMi8zLCAwLCAyLzMsIDEvMykKZ2dwbG90KG5fdGFpbCwgYWVzKHg9cG9zaXRpb24seT1zY29yZSkpICsgZ2VvbV9wb2ludCgpICsgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIikKZ2dwbG90KHNfdGFpbCwgYWVzKHg9cHJvYl90aXR2LHk9c2NvcmUpKSArIGdlb21fcG9pbnQoKSArIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpCmdncGxvdChzX3RhaWwsIGFlcyh5PXByb2JfdGl0dix4PXNjb3JlKSkgKyBnZW9tX3BvaW50KCkgKyBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iKQpyc3EgPC0gZnVuY3Rpb24gKHgsIHkpIGNvcih4LCB5KV4yCm5fcnNxIDwtIHJzcShuX3RhaWwkcG9zaXRpb24sIHNfdGFpbCRzY29yZSkKc19yc3EgPC0gcnNxKHNfdGFpbCRwcm9iX3RpdHYsIHNfdGFpbCRzY29yZSkKbl9yc3EKc19yc3EKI25vIHJlbGF0aW9uc2hpcC4uLgpgYGAKCmBgYHtyIGluY2x1ZGU9RkFMU0V9CiNsb2NhbAojZ2V0dGluZyBkYk5TRlAncyBUUE1UIGluZm9ybWF0aW9uIGZyb20gcnVkZGxlIChkb3dubG9hZGVkIGZyb20gcnVkZGxlIG9udG8gZ29vZ2xlIHNoZWV0cykKCiMgb24gcnVkZGxlLCBgL3ljZ2EtZ3Bmcy9wcm9qZWN0L3lzbS9sZWsvbWwyNTI5L3JlZmVyZW5jZS9kYk5TRlB2Mi45LjMuZ3pgCiMgYG1vZHVsZSBsb2FkIEhUU2xpYi8xLjQuMS1mb3NzLTIwMTZhYAojIGBtb2R1bGUgbG9hZCB0YWJpeC8wLjIuNi1mb3NzLTIwMTZiYAojIGV4dHJhY3QgYWxsIG9mIHRoZSB2YXJpYW50cyBpbiBUUE1UIHdpdGggYHRhYml4IC95Y2dhLWdwZnMvcHJvamVjdC95c20vbGVrL21sMjUyOS9yZWZlcmVuY2UvZGJOU0ZQdjIuOS4zLmd6IDY6MTgxMjg1NDItMTgxNTUzMDVgCgpnc19scygpCnRwbXRfcnVkZGxlIDwtIGdzX3RpdGxlKCJUUE1UX3J1ZGRsZSIpCnRwbXRfcmVhZCA8LSBnc19yZWFkKHNzPXRwbXRfcnVkZGxlLCB3cyA9ICJydWRkbGVfdHBtdF92YXJpYW50cyIpCnRwbXRfcnVkZGxlX2RhdGEgPC0gYXMuZGF0YS5mcmFtZSh0cG10X3JlYWQpCmBgYApgYGB7ciBlY2hvPUZBTFNFfQojZGF0YSBpbiBkYk5TRlAgaXMgb3JkZXJlZCBpbiB0aGUgcmV2ZXJzZSBkaXJlY3Rpb24KI3JldmVyc2luZyBkYXRhIHRvIGZpdCBvdXIgdHBtdDFfZGF0YQpyZXZlciA8LSBmdW5jdGlvbihkZj10cG10X3J1ZGRsZV9kYXRhKXtkZjwtZGZbZGltKGRmKVsxXToxLF19CnRwbXRfcnVkZGxlX2RhdGFfcmV2ID0gcmV2ZXIodHBtdF9ydWRkbGVfZGF0YSkKCiNjcmVhdGluZyB2YXJpYW50IGNvbHVtbiwgZXF1aXYgdG8gdHBtdDFfZGF0YSdzCnRwbXRfcnVkZGxlX2RhdGFfcmV2JHZhcmlhbnQgPC0gZG8uY2FsbChwYXN0ZSwgYyh0cG10X3J1ZGRsZV9kYXRhX3JldltjKDUsMjQsNildLCBzZXA9IiIpKQoKI21ha2luZyBib3RoIHRhYmxlcyBzbWFsbGVyIChnZXR0aW5nIHJpZCBvZiBjb2x1bW5zIHdlIGRvbid0IG5lZWQgZm9yIGVhc2llciB2aWV3aW5nIGluIFJTdHVkaW8pCnRwbXRfZXNzZW50aWFsIDwtIHRwbXRfcnVkZGxlX2RhdGFfcmV2WyxjKDIsMyw0LDUsNiwxNywxOSwyNCwyNywyOCwyOSwzMCwzMSwzMiwzMywzNCwzNSw3Niw3Nyw3OCwxMzcpXQp0cG10MV9wcm9jX2VzcyA8LSB0cG10MV9wcm9jX3d0WyxjKDEsMiwzLDUsNiw3LDMwLDMyLDgwKV0KCiNtZXJnaW5nIHRhYmxlcyB3aXRoIHZhcmlhbnQgbmFtZQp0cG10X21lcmdlIDwtIG1lcmdlKHRwbXQxX3Byb2NfZXNzLCB0cG10X2Vzc2VudGlhbCwgYnk9InZhcmlhbnQiKQoKI2NvbXBhcmluZyBhYnVuZGFuY2Ugc2NvcmVzIHdpdGggdmFyaW91cyBzY29yZXMgaW4gZGJOU0ZQIChjb250YWlucyBhbm5vdGF0aW9ucyBvZiBhbGwgcG90ZW50aWFsIG5vbi1zeW5vbnltb3VzIHNpbmdsZS1udWNsZW90aWRlIHZhcmlhbnRzIChuc1NOVnMpIGluIHRoZSBodW1hbiBnZW5vbWUpCnRwbXRfY29yMSA8LSBnZ3Bsb3QodHBtdF9tZXJnZSwgYWVzKHg9c2NvcmUsIHk9YXMubnVtZXJpYyhTSUZUX3Njb3JlKSkpKyBnZW9tX3BvaW50KGFscGhhID0gMC4yKSArIHhsYWIoIlZBTVAtc2VxIHNjb3JlIikreWxhYigiU0lGVCBzY29yZSIpK2dndGl0bGUoIjEiKSArIHRoZW1lX2J3KCkKdHBtdF9jb3IxLjUgPC0gZ2dwbG90KHRwbXRfbWVyZ2UsIGFlcyh4PXNjb3JlLCB5PWFzLm51bWVyaWMoU0lGVF9jb252ZXJ0ZWRfcmFua3Njb3JlKSkpKyBnZW9tX3BvaW50KGFscGhhID0gMC4yKSArIHhsYWIoIlZBTVAtc2VxIHNjb3JlIikreWxhYigiU0lGVCBjb252ZXJ0ZWQgcmFua3Njb3JlIikrZ2d0aXRsZSgiMS41IikgKyB0aGVtZV9idygpCnRwbXRfY29yNSA8LSBnZ3Bsb3QodHBtdF9tZXJnZSwgYWVzKHg9c2NvcmUsIHk9Q0FERF9yYXdfcmFua3Njb3JlKSkrIGdlb21fcG9pbnQoYWxwaGEgPSAwLjIpICsgeGxhYigiVkFNUC1zZXEgc2NvcmUiKSt5bGFiKCJDQUREIHJhdyByYW5rc2NvcmUiKStnZ3RpdGxlKCI1IikgKyB0aGVtZV9idygpCnRwbXRfY29yMiA8LSBnZ3Bsb3QodHBtdF9tZXJnZSwgYWVzKHg9c2NvcmUsIHk9YXMubnVtZXJpYyhQb2x5cGhlbjJfSERJVl9zY29yZSkpKSsgZ2VvbV9wb2ludChhbHBoYSA9IDAuMikgKyB4bGFiKCJWQU1QLXNlcSBzY29yZSIpK3lsYWIoIlBvbHlwaGVuMiBIRElWIHNjb3JlIikrZ2d0aXRsZSgiMiIpICsgdGhlbWVfYncoKQp0cG10X2NvcjMgPC0gZ2dwbG90KHRwbXRfbWVyZ2UsIGFlcyh4PXNjb3JlLCB5PWFzLm51bWVyaWMoUG9seXBoZW4yX0hWQVJfc2NvcmUpKSkrIGdlb21fcG9pbnQoYWxwaGEgPSAwLjIpICsgeGxhYigiVkFNUC1zZXEgc2NvcmUiKSt5bGFiKCJQb2x5cGhlbjIgSFZBUiBzY29yZSIpK2dndGl0bGUoIjMiKSArIHRoZW1lX2J3KCkKdHBtdF9jb3IyLjUgPC0gZ2dwbG90KHRwbXRfbWVyZ2UsIGFlcyh4PXNjb3JlLCB5PWFzLm51bWVyaWMoUG9seXBoZW4yX0hESVZfcmFua3Njb3JlKSkpKyBnZW9tX3BvaW50KGFscGhhID0gMC4yKSArIHhsYWIoIlZBTVAtc2VxIHNjb3JlIikreWxhYigiUG9seXBoZW4yIEhESVYgcmFua3Njb3JlIikrZ2d0aXRsZSgiMi41IikgKyB0aGVtZV9idygpCnRwbXRfY29yMy41IDwtIGdncGxvdCh0cG10X21lcmdlLCBhZXMoeD1zY29yZSwgeT1hcy5udW1lcmljKFBvbHlwaGVuMl9IVkFSX3JhbmtzY29yZSkpKSsgZ2VvbV9wb2ludChhbHBoYSA9IDAuMikgKyB4bGFiKCJWQU1QLXNlcSBzY29yZSIpK3lsYWIoIlBvbHlwaGVuMiBIVkFSIHJhbmtzY29yZSIpK2dndGl0bGUoIjMuNSIpICsgdGhlbWVfYncoKQoKI0NBRERfcGhyZWQgbm90IHdvcnRoCgojcGxvdCh0cG10X2NvcjUpCiNwbG90KHRwbXRfY29yMSkKI3Bsb3QodHBtdF9jb3IxLjUpCnBsb3QodHBtdF9jb3IyKQpwbG90KHRwbXRfY29yMykKcGxvdCh0cG10X2NvcjIuNSkKcGxvdCh0cG10X2NvcjMuNSkKYGBgCmBgYHtyfQojZGJOU0ZQJ3MgdmFyaW91cyBzY29yZXMgcGxvdHRlZCBhZ2FpbnN0IGFidW5kYW5jZSBzY29yZQoKVFBNVF9hYnVuX0NBREQgPC0gZ2dwbG90KHRwbXRfbWVyZ2UsIGFlcyh4PWFidW5kYW5jZV9jbGFzcywgeT1DQUREX3Jhd19yYW5rc2NvcmUpKSArIGdlb21fdmlvbGluKGRyYXdfcXVhbnRpbGVzID0gYyggMC41KSkreWxhYigiQ0FERCByYXcgcmFua3Njb3JlIikreGxhYigiQWJ1bmRhbmNlIENsYXNzIikgKyB0aGVtZV9idygpCnBsb3QoVFBNVF9hYnVuX0NBREQpCgpUUE1UX2FidW5fU0lGVF9jb252IDwtIGdncGxvdCh0cG10X21lcmdlLCBhZXMoeD1hYnVuZGFuY2VfY2xhc3MsIHk9YXMubnVtZXJpYyhTSUZUX2NvbnZlcnRlZF9yYW5rc2NvcmUpKSkgKyBnZW9tX3Zpb2xpbihkcmF3X3F1YW50aWxlcyA9IGMoMC41KSkreWxhYigiU0lGVCBjb252IHJhbmtzY29yZSIpK3hsYWIoIkFidW5kYW5jZSBDbGFzcyIpICsgdGhlbWVfYncoKQpwbG90KFRQTVRfYWJ1bl9TSUZUX2NvbnYpCgpUUE1UX2FidW5fUE9MWSA8LSBnZ3Bsb3QodHBtdF9tZXJnZSwgYWVzKHg9YWJ1bmRhbmNlX2NsYXNzLCB5PWFzLm51bWVyaWMoUG9seXBoZW4yX0hESVZfcmFua3Njb3JlKSkpICsgZ2VvbV92aW9saW4oZHJhd19xdWFudGlsZXMgPSBjKCAwLjUpKSt5bGFiKCJQb2x5cGhlbjIgSERJViByYW5rc2NvcmUiKSt4bGFiKCJBYnVuZGFuY2UgQ2xhc3MiKSArIHRoZW1lX2J3KCkKcGxvdChUUE1UX2FidW5fUE9MWSkKClRQTVRfYWJ1bl9QT0xZMSA8LSBnZ3Bsb3QodHBtdF9tZXJnZSwgYWVzKHg9YWJ1bmRhbmNlX2NsYXNzLCB5PWFzLm51bWVyaWMoUG9seXBoZW4yX0hWQVJfcmFua3Njb3JlKSkpICsgZ2VvbV92aW9saW4oZHJhd19xdWFudGlsZXMgPSBjKCAwLjUpKSt5bGFiKCJQb2x5cGhlbjIgSFZBUiByYW5rc2NvcmUiKSt4bGFiKCJBYnVuZGFuY2UgQ2xhc3MiKSArIHRoZW1lX2J3KCkKcGxvdChUUE1UX2FidW5fUE9MWTEpCmBgYApgYGB7cn0KIyBCYXIgcGxvdHMgb2Ygd2hhdCBQb2x5cGhlbiBhbmQgU0lGVCBzY29yZXMgbWFrZSB1cCBlYWNoIGFidW5kYW5jZSBjbGFzcyEKUHJlZF9hYnVuX1NJRlQgPC0gZ2dwbG90KHRwbXRfbWVyZ2UsIGFlcyhhYnVuZGFuY2VfY2xhc3MpKSArIGdlb21fYmFyKGFlcyhmaWxsID0gU0lGVF9wcmVkKSkgKyBnZ3RpdGxlKCJBYnVuZGFuY2UgY2xhc3MgdnMgU0lGVCBwcmVkaWN0aW9uIG9mIERhbWFnaW5nIG9yIFRvbGVyYXRlZCIpICsgdGhlbWVfYncoKQpwbG90KFByZWRfYWJ1bl9TSUZUKQoKdHJpYWxfc2VwIDwtIHRwbXRfbWVyZ2VbYygyMSwyMywyNCwyNildCnRwbXRfbWVyZ2VfZXhwYW5kIDwtIHNlcGFyYXRlX3Jvd3ModHBtdF9tZXJnZSwgYygiUG9seXBoZW4yX0hESVZfc2NvcmUiLCAiUG9seXBoZW4yX0hESVZfcHJlZCIsICJQb2x5cGhlbjJfSFZBUl9zY29yZSIsICJQb2x5cGhlbjJfSFZBUl9wcmVkIikpCgpQcmVkX2FidW5fSFZBUiA8LSBnZ3Bsb3QodHBtdF9tZXJnZV9leHBhbmQsIGFlcyhhYnVuZGFuY2VfY2xhc3MpKSArIGdlb21fYmFyKGFlcyhmaWxsID0gUG9seXBoZW4yX0hWQVJfcHJlZCkpICsgZ2d0aXRsZSgiQWJ1bmRhbmNlIGNsYXNzIHZzIFBvbHlwaGVuMiBIVkFSIHByZWRpY3Rpb25zIikgKyBsYWJzKHN1YnRpdGxlID0gIkQ6IFByb2JhYmx5IERhbWFnaW5nLCBQOiBQb3NzaWJseSBEYW1hZ2luZywgQjogQmVuaWduIikgKyB0aGVtZV9idygpCnBsb3QoUHJlZF9hYnVuX0hWQVIpCmBgYAoKYGBge3IgaW5jbHVkZT1GQUxTRX0KIyBGb3IgUHlNT0wsIGNyZWF0aW9uIG9mIGFycmF5IHRvIHVzZSB0byBjb2xvciBQVEVOIGFuZCBUUE1UCgojY3JlYXRpb24gb2YgYi1zY29yZSB0ZXh0IGZpbGVzIGZvciBweW1vbCB1c2UKcHRlbl9weW1vbCA8LSBzdW1tYXJ5U0UocHRlbjFfZGF0YSwgbWVhc3VyZXZhcj0ic2NvcmUiLCBncm91cHZhcnM9InBvc2l0aW9uIiwgbmEucm09VFJVRSkKI3Njb3JlWzQwNF0gaXMgd3QKd3JpdGUudGFibGUocHRlbl9weW1vbCRzY29yZVsxOjQwM10sICJwdGVuX21lYW5fc2NvcmVzX3B5bW9sLnR4dCIsIHNlcD0iXG4iLCByb3cubmFtZXM9RiwgY29sLm5hbWVzPUYsIG5hID0gIk5hTiIpCgp0cG10X3B5bW9sIDwtIHN1bW1hcnlTRSh0cG10MV9kYXRhLCBtZWFzdXJldmFyPSJzY29yZSIsIGdyb3VwdmFycz0icG9zaXRpb24iLCBuYS5ybT1UUlVFKQojc2NvcmVbNDA0XSBpcyB3dAp3cml0ZS50YWJsZSh0cG10X3B5bW9sJHNjb3JlWzE6MjQ1XSwgInRwbXRfbWVhbl9zY29yZXNfcHltb2wudHh0Iiwgc2VwPSJcbiIsIHJvdy5uYW1lcz1GLCBjb2wubmFtZXM9RiwgbmEgPSAiTmFOIikKYGBgCgpgYGB7cn0KIyBGb2N1c2luZyBvbiBpbmRpdmlkdWFsICJlbmQiLCBvciB2YXJpYW50LCBhbWlubyBhY2lkcyEgQSBsb3QgbW9yZSBjYW4gYmUgZG9uZS4uLiBhbmQgYSBsb3Qgb2Ygd2hhdCBJIGhhdmUgaGVyZSBpcyB1bmZvY3VzZWQgYW5kIHRvbyBidXN5IHRvIGJlIGhlbHBmdWwKCnR3ZW50eV9jb2xvcjEgPSBjKCIjRDAyMDI4IiwgIiNBNEMzM0IiLCIjNTM5NThCIiwgIiNFNkEzQjQiLCAiI0M1QTBDQSIsICIjNTU0REEwIiwgIiM5OTI0N0UiLCAiIzQwMjA1OSIsICIjODI0MjFCIiwgIiM3RTgwN0UiLCAnYmxhY2snLCAiI0VERDk0MSIsICIjRjJGMDhFIiwgIiNFRUM4OTgiLCAiI0UxQTEyRiIsICIjNzZDMTU4IiwgICIjQkNEREFFIiwgIiM4NTc4MkUiLCAiIzMxNTkzNSIsICIjQTFEQUUwIiwgIiM0ODZFQjYiKQoKIyBKdXN0IHRvIHVzZSBhcyBhIHJlZmVyZW5jZSB0cmFjawpwdGVuX2Rzc3Bfc2NoZW1hdGljMSA8LSBnZ3Bsb3QoKSArCiAgZ2VvbV9zZWdtZW50KGFlcyh4ID0gMSwgeSA9IDAsIHhlbmQgPSBtYXgocHRlbl9leHRyYSRwb3NpdGlvbikpLCB5ZW5kID0gMCwgc2l6ZSA9IDEsIGNvbG9yID0gImdyZXk3MCIpICsKICBnZW9tX3BvaW50KGRhdGEgPSBzdWJzZXQocHRlbl9leHRyYSwgIWlzLm5hKHhjYSkpLCBhZXMoeCA9IHBvc2l0aW9uLCB5ID0gMCksIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEuOCkgKwogIGdlb21fcG9pbnQoZGF0YSA9IHN1YnNldChwdGVuX2V4dHJhLCBzaGVldCA9PSAxKSwgYWVzKHggPSBwb3NpdGlvbiwgeSA9IDApLCBjb2xvciA9ICJwaW5rIiwgc2l6ZSA9IDEuNSkgKwogIGdlb21fcG9pbnQoZGF0YSA9IHN1YnNldChwdGVuX2V4dHJhLCBoZWxpeCA9PSAxKSwgYWVzKHggPSBwb3NpdGlvbiwgeSA9IDApLCBjb2xvciA9ICJjeWFuIiwgc2l6ZSA9IDEuNSkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgNDAzLCAyMCksIGV4cGFuZCA9IGMoMCwwKSkgKwogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBOVUxMLCBleHBhbmQgPSBjKDAsMCkpICt4bGFiKCJQb3NpdGlvbiBpbiBQVEVOIikgKyB5bGFiKCJcbiBcbiBcbiIpICsKICB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X2JsYW5rKCksIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpKQoKIyBkaWZmZXJlbnQgYW1pbm8gYWNpZCBsaXN0cywgY2FuIGJlIHVzZWQgdG8gc3dhcCBpbiBhbmQgb3V0IG9mIHRoZSBiZWxvdyBncmFwaHMgaWYgeW91IGRvbid0IHdhbnQgdG8gcGxvdCBhbGwgYW1pbm8gYWNpZHMKYWFzIDwtIGMoIkEiLCAiQyIsICJQIiwgIlgiKQphYXMxIDwtIGMoIlMiLCAiQyIsICJQIiwgIlgiKQphYXMyIDwtIGMoIkEiLCAiQyIsICJEIiwgIkUiLCAiRiIsICJHIiwgIkgiLCAiSSIsICJLIiwgIkwiLCAiTSIsICJOIiwgIlAiLCAiUSIsICJSIiwgIlMiLCAiVCIsICJWIiwgIlciLCAiWSIpCgojIFNjYXR0ZXIgcGxvdCBvZiBhbGwgQWxhbmluZSB2YXJpYW50cyAoY29sb3JlZCBieSByZWZlcmVuY2UgYW1pbm8gYWNpZCkKcHRlbl9hX3BvcyA8LSBnZ3Bsb3QoZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgZW5kPT0iQSIpLCBhZXMoeD1wb3NpdGlvbiwgeT1zY29yZSwgY29sb3VyPXN0YXJ0KSkrIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgZW5kPT0iQSIgJiBzdGFydCAlaW4lIGFhczIpLCBzaXplPS42KSArIHNjYWxlX3hfY29udGludW91cyhicmVha3M9c2VxKDAsIDQwMywgMjApLCBtaW5vcl9icmVha3MgPSBzZXEoMCwgNDAzLCA1KSwgbGltaXRzID0gYygwLCA0MDMpLCBleHBhbmQgPSBjKDAsMCkpICsgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwgbGltaXRzID0gYygtMC4yNSwgMS41KSkgKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPXR3ZW50eV9jb2xvcjEpICt5bGFiKCJBYnVuZGFuY2Ugc2NvcmUiKStsYWJzKGNvbG91cj0iUmVmZXJlbmNlIGFtaW5vIGFjaWQiKSt4bGFiKE5VTEwpK2dndGl0bGUoIkFidW5kYW5jZSBzY29yZXMgb2YgQWxhbmluZSB2YXJpYW50cyIpICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksIGxlZ2VuZC5wb3NpdGlvbj0ndG9wJykgKyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9MSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0uMSkKI3Bsb3QocHRlbl9hX3BvcykKCiMgUmVwZWF0ZWQgZm9yIFNlcmluZSwgQ3lzdGVpbmUsIE5vbnNlbnNlLCBldGMKcHRlbl9zX3BvcyA8LSBnZ3Bsb3QoZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgZW5kPT0iUyIpLCBhZXMoeD1wb3NpdGlvbiwgeT1zY29yZSwgY29sb3VyPXN0YXJ0KSkrIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgZW5kPT0iUyIgJiBzdGFydCAlaW4lIGFhczIpLCBzaXplPS42KSArIHNjYWxlX3hfY29udGludW91cyhicmVha3M9c2VxKDAsIDQwMywgMjApLCBtaW5vcl9icmVha3MgPSBzZXEoMCwgNDAzLCA1KSwgbGltaXRzID0gYygwLCA0MDMpLCBleHBhbmQgPSBjKDAsMCkpICsgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwgbGltaXRzID0gYygtMC4yNSwgMS41KSkgKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPXR3ZW50eV9jb2xvcjEpICt5bGFiKCJBYnVuZGFuY2Ugc2NvcmUiKStsYWJzKGNvbG91cj0iUmVmZXJlbmNlIGFtaW5vIGFjaWQiKSt4bGFiKE5VTEwpK2dndGl0bGUoIkFidW5kYW5jZSBzY29yZXMgb2YgU2VyaW5lIHZhcmlhbnRzIikgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwgbGVnZW5kLnBvc2l0aW9uPSd0b3AnKSArIGdlb21faGxpbmUoeWludGVyY2VwdD0xLCBjb2xvcj0iYmxhY2siLCBzaXplPS4xKQoKcHRlbl9jX3BvcyA8LSBnZ3Bsb3QoZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgZW5kPT0iQyIpLCBhZXMoeD1wb3NpdGlvbiwgeT1zY29yZSwgY29sb3VyPXN0YXJ0KSkrIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgZW5kPT0iQyIgJiBzdGFydCAlaW4lIGFhczIpLCBzaXplPS42KSArIHNjYWxlX3hfY29udGludW91cyhicmVha3M9c2VxKDAsIDQwMywgMjApLCBtaW5vcl9icmVha3MgPSBzZXEoMCwgNDAzLCA1KSwgbGltaXRzID0gYygwLCA0MDMpLCBleHBhbmQgPSBjKDAsMCkpICsgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwgbGltaXRzID0gYygtMC4yNSwgMS41KSkgKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPXR3ZW50eV9jb2xvcjEpICt5bGFiKCJBYnVuZGFuY2Ugc2NvcmUiKStsYWJzKGNvbG91cj0iUmVmZXJlbmNlIGFtaW5vIGFjaWQiKSt4bGFiKE5VTEwpK2dndGl0bGUoIkFidW5kYW5jZSBzY29yZXMgb2YgQ3lzdGVpbmUgdmFyaWFudHMiKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLCBsZWdlbmQucG9zaXRpb249J3RvcCcpICsgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTEsIGNvbG9yPSJibGFjayIsIHNpemU9LjEpCgpwdGVuX3hfcG9zIDwtIGdncGxvdChkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBlbmQ9PSJYIiksIGFlcyh4PXBvc2l0aW9uLCB5PXNjb3JlLCBjb2xvdXI9c3RhcnQpKSsgZ2VvbV9wb2ludChkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBlbmQ9PSJYIiAmIHN0YXJ0ICVpbiUgYWFzMiksIHNpemU9LjYpICsgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz1zZXEoMCwgNDAzLCAyMCksIG1pbm9yX2JyZWFrcyA9IHNlcSgwLCA0MDMsIDUpLCBsaW1pdHMgPSBjKDAsIDQwMyksIGV4cGFuZCA9IGMoMCwwKSkgKyBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApLCBsaW1pdHMgPSBjKC0wLjI1LCAxLjUpKSArIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9dHdlbnR5X2NvbG9yMSkgK3lsYWIoIkFidW5kYW5jZSBzY29yZSIpK2xhYnMoY29sb3VyPSJSZWZlcmVuY2UgYW1pbm8gYWNpZCIpK3hsYWIoTlVMTCkrZ2d0aXRsZSgiQWJ1bmRhbmNlIHNjb3JlcyBvZiBub25zZW5zZSB2YXJpYW50cyIpICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksIGxlZ2VuZC5wb3NpdGlvbj0ndG9wJykgKyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9MSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0uMSkKCmdyaWQubmV3cGFnZSgpCmdyaWQuZHJhdyhyYmluZChnZ3Bsb3RHcm9iKHB0ZW5fYV9wb3MpLCBnZ3Bsb3RHcm9iKHB0ZW5fZHNzcF9zY2hlbWF0aWMxKSwgc2l6ZSA9ICJsYXN0IikpCmdyaWQubmV3cGFnZSgpCmdyaWQuZHJhdyhyYmluZChnZ3Bsb3RHcm9iKHB0ZW5fc19wb3MpLCBnZ3Bsb3RHcm9iKHB0ZW5fZHNzcF9zY2hlbWF0aWMxKSwgc2l6ZSA9ICJsYXN0IikpCmdyaWQubmV3cGFnZSgpCmdyaWQuZHJhdyhyYmluZChnZ3Bsb3RHcm9iKHB0ZW5fY19wb3MpLCBnZ3Bsb3RHcm9iKHB0ZW5fZHNzcF9zY2hlbWF0aWMxKSwgc2l6ZSA9ICJsYXN0IikpCmdyaWQubmV3cGFnZSgpCmdyaWQuZHJhdyhyYmluZChnZ3Bsb3RHcm9iKHB0ZW5feF9wb3MpLCBnZ3Bsb3RHcm9iKHB0ZW5fZHNzcF9zY2hlbWF0aWMxKSwgc2l6ZSA9ICJsYXN0IikpCmBgYApgYGB7cn0KIyBNb3JlIG9mIGFib3ZlCiNzbmFrZSBhdCB0aGUgZW5kIChhcmNoZXMgb3ZlciBncmV5IHJlZ2lvbikKcHRlbl9wX3BvcyA8LSBnZ3Bsb3QoZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgZW5kPT0iUCIpLCBhZXMoeD1wb3NpdGlvbiwgeT1zY29yZSwgY29sb3VyPXN0YXJ0KSkrIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgZW5kPT0iUCIgJiBzdGFydCAlaW4lIGFhczIpLCBzaXplPS42KSArIHNjYWxlX3hfY29udGludW91cyhicmVha3M9c2VxKDAsIDQwMywgMjApLCBtaW5vcl9icmVha3MgPSBzZXEoMCwgNDAzLCA1KSwgbGltaXRzID0gYygwLCA0MDMpLCBleHBhbmQgPSBjKDAsMCkpICsgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwgbGltaXRzID0gYygtMC4yNSwgMS41KSkgKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPXR3ZW50eV9jb2xvcjEpICt5bGFiKCJBYnVuZGFuY2Ugc2NvcmUiKStsYWJzKGNvbG91cj0iUmVmZXJlbmNlIGFtaW5vIGFjaWQiKSt4bGFiKE5VTEwpK2dndGl0bGUoIkFidW5kYW5jZSBzY29yZXMgb2YgUHJvbGluZSB2YXJpYW50cyIpICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksIGxlZ2VuZC5wb3NpdGlvbj0ndG9wJykgKyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9MSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0uMSkKZ3JpZC5uZXdwYWdlKCkKZ3JpZC5kcmF3KHJiaW5kKGdncGxvdEdyb2IocHRlbl9wX3BvcyksIGdncGxvdEdyb2IocHRlbl9kc3NwX3NjaGVtYXRpYzEpLCBzaXplID0gImxhc3QiKSkKYGBgCmBgYHtyfQojIE1vcmUgb2YgYWJvdmUKI21hdGNoaW5nIHNuYWtlIGF0IHRoZSBlbmQhCnB0ZW5fZ19wb3MgPC0gZ2dwbG90KGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIGVuZD09IkciKSwgYWVzKHg9cG9zaXRpb24sIHk9c2NvcmUsIGNvbG91cj1zdGFydCkpKyBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIGVuZD09IkciICYgc3RhcnQgJWluJSBhYXMyKSwgc2l6ZT0uNikgKyBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPXNlcSgwLCA0MDMsIDIwKSwgbWlub3JfYnJlYWtzID0gc2VxKDAsIDQwMywgNSksIGxpbWl0cyA9IGMoMCwgNDAzKSwgZXhwYW5kID0gYygwLDApKSArIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCksIGxpbWl0cyA9IGMoLTAuMjUsIDEuNSkpICsgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz10d2VudHlfY29sb3IxKSAreWxhYigiQWJ1bmRhbmNlIHNjb3JlIikrbGFicyhjb2xvdXI9IlJlZmVyZW5jZSBhbWlubyBhY2lkIikreGxhYihOVUxMKStnZ3RpdGxlKCJBYnVuZGFuY2Ugc2NvcmVzIG9mIEdseWNpbmUgdmFyaWFudHMiKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLCBsZWdlbmQucG9zaXRpb249J3RvcCcpICsgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTEsIGNvbG9yPSJibGFjayIsIHNpemU9LjEpCmdyaWQubmV3cGFnZSgpCmdyaWQuZHJhdyhyYmluZChnZ3Bsb3RHcm9iKHB0ZW5fZ19wb3MpLCBnZ3Bsb3RHcm9iKHB0ZW5fZHNzcF9zY2hlbWF0aWMxKSwgc2l6ZSA9ICJsYXN0IikpCgpwdGVuX2hfcG9zIDwtIGdncGxvdChkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBlbmQ9PSJIIiksIGFlcyh4PXBvc2l0aW9uLCB5PXNjb3JlLCBjb2xvdXI9c3RhcnQpKSsgZ2VvbV9wb2ludChkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBlbmQ9PSJIIiAmIHN0YXJ0ICVpbiUgYWFzMiksIHNpemU9LjYpICsgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz1zZXEoMCwgNDAzLCAyMCksIG1pbm9yX2JyZWFrcyA9IHNlcSgwLCA0MDMsIDUpLCBsaW1pdHMgPSBjKDAsIDQwMyksIGV4cGFuZCA9IGMoMCwwKSkgKyBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApLCBsaW1pdHMgPSBjKC0wLjI1LCAxLjUpKSArIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9dHdlbnR5X2NvbG9yMSkgK3lsYWIoIkFidW5kYW5jZSBzY29yZSIpK2xhYnMoY29sb3VyPSJSZWZlcmVuY2UgYW1pbm8gYWNpZCIpK3hsYWIoTlVMTCkrZ2d0aXRsZSgiQWJ1bmRhbmNlIHNjb3JlcyBvZiBIaXN0aWRpbmUgdmFyaWFudHMiKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLCBsZWdlbmQucG9zaXRpb249J3RvcCcpICsgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTEsIGNvbG9yPSJibGFjayIsIHNpemU9LjEpCmdyaWQubmV3cGFnZSgpCmdyaWQuZHJhdyhyYmluZChnZ3Bsb3RHcm9iKHB0ZW5faF9wb3MpLCBnZ3Bsb3RHcm9iKHB0ZW5fZHNzcF9zY2hlbWF0aWMxKSwgc2l6ZSA9ICJsYXN0IikpCgojIG5vdGljZSAybmQgdG8gbGFzdCBsaWdodCBncmV5IHJlZ2lvbiBvbiByZWZlcmVuY2UgdHJhY2ssIGFsbCB2YXJpYW50cyBhcmUgaGlnaCBhYnVuZGFuY2UgdGhlcmUKcHRlbl93X3BvcyA8LSBnZ3Bsb3QoZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgZW5kPT0iVyIpLCBhZXMoeD1wb3NpdGlvbiwgeT1zY29yZSwgY29sb3VyPXN0YXJ0KSkrIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgZW5kPT0iVyIgJiBzdGFydCAlaW4lIGFhczIpLCBzaXplPS42KSArIHNjYWxlX3hfY29udGludW91cyhicmVha3M9c2VxKDAsIDQwMywgMjApLCBtaW5vcl9icmVha3MgPSBzZXEoMCwgNDAzLCA1KSwgbGltaXRzID0gYygwLCA0MDMpLCBleHBhbmQgPSBjKDAsMCkpICsgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwgbGltaXRzID0gYygtMC4yNSwgMS41KSkgKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPXR3ZW50eV9jb2xvcjEpICt5bGFiKCJBYnVuZGFuY2Ugc2NvcmUiKStsYWJzKGNvbG91cj0iUmVmZXJlbmNlIGFtaW5vIGFjaWQiKSt4bGFiKE5VTEwpK2dndGl0bGUoIkFidW5kYW5jZSBzY29yZXMgb2YgVHlwdG9waGFuIHZhcmlhbnRzIikgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwgbGVnZW5kLnBvc2l0aW9uPSd0b3AnKSArIGdlb21faGxpbmUoeWludGVyY2VwdD0xLCBjb2xvcj0iYmxhY2siLCBzaXplPS4xKQpncmlkLm5ld3BhZ2UoKQpncmlkLmRyYXcocmJpbmQoZ2dwbG90R3JvYihwdGVuX3dfcG9zKSwgZ2dwbG90R3JvYihwdGVuX2Rzc3Bfc2NoZW1hdGljMSksIHNpemUgPSAibGFzdCIpKQpgYGAKCgoK